<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>calibrate_hand_eye [HALCON算子参考手册]</title>
<style type="text/css">
      body {
    color: #000000;
    background-color: #ffffff;
    margin: 0;
    font-family: Arial, Helvetica, sans-serif;
}

.body_main {
    margin-left: 35px;
    margin-right: 35px;
}

@media screen and (min-width:992px) {

    .body_main {
        margin-left: 10%;
        margin-right: 10%;
    }

    table.toctable {
        width: 80%
    }
}

@media screen and (min-width:1400px) {

    .body_main {
        margin-left: 15%;
        margin-right: 15%;
    }

    table.toctable {
        width: 70%
    }
}

body>div ul ul {
    margin-left: inherit;
}

a:link {
    color: #0044cc;
}

a:link,
a:visited {
    text-decoration: none;
}

a:link:hover,
a:visited:hover {
    text-decoration: underline;
}

th {
    text-align: left;
}

h1,
h2,
h3,
h4,
h5,
h6 {
    text-rendering: optimizeLegibility;
    color: #666666;
}

code {
    font-family: monospace,monospace;
}

h1 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

h2 a.halconoperator {
    font-family: Arial, Helvetica, sans-serif;
    color: #666666;
}

hr {
    border: 0;
    border-top: solid 1px #f28d26;
}

.pre {
    display: block;
    padding-bottom: 1ex;
    font-family: monospace;
    white-space: pre;
}

pre {
    font-family: monospace, monospace;
    padding: 1ex;
    white-space: pre-wrap;
}

.toc {
    font-size: 80%;
    border-top: 1px dashed #f28d26;
    border-bottom: 1px dashed #f28d26;
    padding-top: 5px;
    padding-bottom: 5px;
}

.inv {
    margin: 0;
    border: 0;
    padding: 0;
}

.banner {
    color: #666666;
    padding-left: 1em;
}

.logo {
    background-color: white;
}

.keyboard {
    font-size: 80%;
    padding-left: 3px;
    padding-right: 3px;
    border-radius: 5px;
    border-width: 1px;
    border-style: solid;
    border-color: #f28d26;
    background-color: #f3f3f3;
}

.warning {
    margin-top: 2ex;
    margin-bottom: 1ex;
    padding: 10px;
    text-align: center;
    border: 1px solid;
    color: #bb0000;
    background-color: #fff7f7
}

.imprint {
    margin-top: 1ex;
    font-size: 80%;
    color: #666666;
}

.imprinthead {
    font-weight: bolder;
    color: #666666;
}

.indexlink {
    text-align: right;
    padding-bottom: 5px;
}

.postscript {
    margin-top: 2ex;
    font-size: 80%;
    color: #666666
}

.evenrow {
    background-color: #e7e7ef;
    vertical-align: top;
}

.oddrow {
    background-color: #f7f7ff;
    vertical-align: top;
}

.headrow {
    background-color: #97979f;
    color: #ffffff;
    vertical-align: top;
}

.logorow {
    vertical-align: top;
}

.error {
    color: red;
}

.var {
    font-style: italic
}

.halconoperator {
    font-family: monospace, monospace;
}

span.operator {
    font-family: monospace, monospace;
}

span.procedure {
    font-family: monospace, monospace;
}

span.operation {
    font-family: monospace, monospace;
}

span.feature {
    font-family: Arial, Helvetica, Homerton, sans-serif;
}

ul {
    padding-left: 1.2em;
}

li.dot {
    list-style-type: square;
    color: #f28d26;
}

.breadcrumb {
    font-size: 80%;
    color: white;
    background-color: #062d64;
    margin-bottom: 20px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 15px;
}

.webbar {
    font-size: 80%;
    background-color: #dddddd;
    margin-top: 0px;
    margin-left: -35px;
    margin-right: -35px;
    margin-bottom: 0px;
    padding-top: 5px;
    padding-left: 35px;
    padding-right: 35px;
    padding-bottom: 5px;
}

.footer {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    border-top: 1px dashed #f28d26;
    font-size: 80%;
    color: #666666;
    padding-bottom: 8px;
}

.footer .socialmedia a {
    padding-left: 7px;
}

.socialmedia {
    padding-top: 10px;
}

.copyright {
    margin-top: 19px;
}

.breadcrumb a {
    color: #ffffff;
    border-bottom: 1px solid white;
}

.breadcrumb a:link:hover,
.breadcrumb a:visited:hover {
    text-decoration: none;
    border-bottom: none;
}

.heading {
    margin-top: 1ex;
    font-size: 110%;
    font-weight: bold;
    color: #666666;
}

.text {
    color: black;
}

.example {
    font-size: 80%;
    background-color: #f3f3f3;
    border: 1px dashed #666666;
    padding: 10px;
}

.displaymath {
    display: block;
    text-align: center;
    margin-top: 1ex;
    margin-bottom: 1ex;
}

.title {
    float: left;
    padding-top: 3px;
    padding-bottom: 3px;
}

.signnote {
    font-family: Arial, Helvetica, Homerton, sans-serif;
    font-size: 80%;
    color: #666666;
    font-weight: lighter;
    font-style: italic
}

.par {
    margin-bottom: 1.5em;
}

.parhead {
    text-align: right;
}

.parname {
    float: left;
}

.pardesc {
    font-size: 85%;
    margin-top: 0.5em;
    margin-bottom: 0.5em;
    margin-left: 2em;
}

.parcat {
    color: #666;
    font-weight: bold;
}

*[data-if=cpp],
*[data-if=c],
*[data-if=dotnet],
*[data-if=com],
*[data-if=python] {
    display: none;
}

.tabbar {
    text-align: right;
    border-bottom: 1px solid #f28d26;
    margin-bottom: 0.5em;
}

ul.tabs {
    padding-top: 3px;
    padding-bottom: 3px;
    margin-top: 10px;
    margin-bottom: 0;
    font-size: 80%
}

ul.tabs li {
    padding-top: 3px;
    padding-bottom: 3px;
    display: inline;
    overflow: hidden;
    list-style-type: none;
    margin: 0;
    margin-left: 8px;
    border-top: 1px solid #666;
    border-left: 1px solid #666;
    border-right: 1px solid #666;
}

ul.tabs li.active {
    border-left: 1px solid #f28d26;
    border-right: 1px solid #f28d26;
    border-top: 1px solid #f28d26;
    border-bottom: 1px solid #fff;
}

ul.tabs li.inactive {
    background-color: #eee;
}

ul.tabs li a {
    padding-left: 5px;
    padding-right: 5px;
    color: #666;
}

ul.tabs li a:link:hover {
    text-decoration: none;
}

ul.tabs li.inactive a {
    color: #666;
}

ul.tabs li.active a {
    color: black;
}

dl.generic dd {
    margin-bottom: 1em;
}

.pari {
    color: olive;
}

.paro {
    color: maroon;
}

.comment {
    font-size: 80%;
    color: green;
    white-space: nowrap;
}

table.grid {
    border-collapse: collapse;
}

table.grid td {
    padding: 5px;
    border: 1px solid;
}

table.layout {
    border: 0px;
}

table.layout td {
    padding: 5px;
}

table.table {
    border-collapse: collapse;
}

table.table td {
    padding: 5px;
    border-left: 0px;
    border-right: 0px;
}

table.table tr:last-child {
    border-bottom: 1px solid;
}

table.table th {
    padding: 5px;
    border-top: 1px solid;
    border-bottom: 1px solid;
    border-left: 0px;
    border-right: 0px;
}

.details_summary {
    cursor: pointer;
}

table.toctable {
    width: 100%;
}

table.toctable col:first-child {
    width: 20%;
}

table.toctable col:nth-last-child(2) {
    width: 8%;
}

table.altcolored tr:nth-child(even) {
    background-color: #f3f3f3;
}

    </style>
<!--OP_REF_STYLE_END-->
<script>
    <!--
var active_lang='hdevelop';function switchVisibility(obj,active_lang,new_lang)
{var display_style='inline';
for(var i=0;i<obj.length;i++)
{if(obj.item(i).getAttribute('data-if')==new_lang)
{obj.item(i).style.display=display_style;}
if(obj.item(i).getAttribute('data-if')==active_lang)
{obj.item(i).style.display='none';}}
return;}
function toggleLanguage(new_lang,initial)
{if(active_lang!=new_lang)
{var lis=document.getElementsByTagName('li');for(var i=0;i<lis.length;i++)
{if(lis.item(i).id=='syn-'+new_lang)
{lis.item(i).className='active';}
else
{lis.item(i).className='inactive';}}
var divs=document.getElementsByTagName('div');var spans=document.getElementsByTagName('span');switchVisibility(divs,active_lang,new_lang);switchVisibility(spans,active_lang,new_lang);if(!initial)
{setCookie("halcon_reference_language",new_lang,null,null);}
active_lang=new_lang;}
return;}
function setCookie(name,value,domain,exp_offset,path,secure)
{localStorage.setItem(name,value);}
function getCookie(name)
{return localStorage.getItem(name);}
function initialize()
{var qs=location.href.split('?')[1];var qs_lang_raw=location.href.split('interface=')[1];var qs_lang;if(qs_lang_raw)
{qs_lang=qs_lang_raw.split('#')[0];}
var cookie_lang=getCookie("halcon_reference_language");var new_lang;if((qs_lang=="hdevelop")||(qs_lang=="dotnet")||(qs_lang=="python")||(qs_lang=="cpp")||(qs_lang=="c"))
{new_lang=qs_lang;setCookie("halcon_reference_language",new_lang,null,null);}
else if((cookie_lang=="hdevelop")||(cookie_lang=="dotnet")||(cookie_lang=="python")||(cookie_lang=="cpp")||(cookie_lang=="c"))
{new_lang=cookie_lang;}
else
{new_lang="hdevelop";}
toggleLanguage(new_lang,1);return;}
-->

  </script>
</head>
<body onload="initialize();">
<div class="breadcrumb">
<br class="inv"><a href="index.html">目录</a> / <a href="toc_calibration.html">Calibration</a> / <a href="toc_calibration_handeye.html">Hand-Eye</a><br class="inv">
</div>
<div class="body_main">
<div class="tabbar"><ul class="tabs">
<li id="syn-hdevelop" class="active"><a href="javascript:void(0);" onclick="toggleLanguage('hdevelop')" onfocus="blur()">HDevelop</a></li>
<li id="syn-dotnet" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('dotnet')" onfocus="blur()">.NET</a></li>
<li id="syn-python" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('python')" onfocus="blur()">Python</a></li>
<li id="syn-cpp" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('cpp')" onfocus="blur()">C++</a></li>
<li id="syn-c" class="inactive"><a href="javascript:void(0);" onclick="toggleLanguage('c')" onfocus="blur()">C</a></li>
</ul></div>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<!--OP_REF_HEADER_END-->
<h1 id="sec_name">
<span data-if="hdevelop" style="display:inline;">calibrate_hand_eye</span><span data-if="c" style="display:none;">T_calibrate_hand_eye</span><span data-if="cpp" style="display:none;">CalibrateHandEye</span><span data-if="dotnet" style="display:none;">CalibrateHandEye</span><span data-if="python" style="display:none;">calibrate_hand_eye</span> (算子名称)</h1>
<h2>名称</h2>
<p><code><span data-if="hdevelop" style="display:inline;">calibrate_hand_eye</span><span data-if="c" style="display:none;">T_calibrate_hand_eye</span><span data-if="cpp" style="display:none;">CalibrateHandEye</span><span data-if="dotnet" style="display:none;">CalibrateHandEye</span><span data-if="python" style="display:none;">calibrate_hand_eye</span></code> — Perform a hand-eye calibration.</p>
<h2 id="sec_synopsis">参数签名</h2>
<div data-if="hdevelop" style="display:inline;">
<p>
<code><b>calibrate_hand_eye</b>( :  : <a href="#CalibDataID"><i>CalibDataID</i></a> : <a href="#Errors"><i>Errors</i></a>)</code></p>
</div>
<div data-if="c" style="display:none;">
<p>
<code>Herror <b>T_calibrate_hand_eye</b>(const Htuple <a href="#CalibDataID"><i>CalibDataID</i></a>, Htuple* <a href="#Errors"><i>Errors</i></a>)</code></p>
</div>
<div data-if="cpp" style="display:none;">
<p>
<code>void <b>CalibrateHandEye</b>(const HTuple&amp; <a href="#CalibDataID"><i>CalibDataID</i></a>, HTuple* <a href="#Errors"><i>Errors</i></a>)</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCalibData.html">HCalibData</a>::<b>CalibrateHandEye</b>() const</code></p>
</div>
<div data-if="com" style="display:none;"></div>
<div data-if="dotnet" style="display:none;">
<p>
<code>static void <a href="HOperatorSet.html">HOperatorSet</a>.<b>CalibrateHandEye</b>(<a href="HTuple.html">HTuple</a> <a href="#CalibDataID"><i>calibDataID</i></a>, out <a href="HTuple.html">HTuple</a> <a href="#Errors"><i>errors</i></a>)</code></p>
<p>
<code><a href="HTuple.html">HTuple</a> <a href="HCalibData.html">HCalibData</a>.<b>CalibrateHandEye</b>()</code></p>
</div>
<div data-if="python" style="display:none;">
<p>
<code>def <b>calibrate_hand_eye</b>(<a href="#CalibDataID"><i>calib_data_id</i></a>: HHandle) -&gt; Sequence[float]</code></p>
</div>
<h2 id="sec_description">描述</h2>
<p>该算子 <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code> determines the 3D pose of a robot
(“hand”) relative to a camera or 3D sensor (“eye”) based on the
calibration data model <a href="#CalibDataID"><i><code><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></code></i></a>. With the determined 3D poses,
the poses of the calibration object in the camera coordinate system can be
transformed into the coordinate system of the robot which can then, e.g.,
grasp an inspected part. There are two possible configurations of
robot-camera (hand-eye) systems:
The camera can be mounted on the robot or be stationary and observe the
robot. Note that the term robot is used in place of a mechanism that moves
objects. Thus, you can use <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code> to calibrate many
different systems, from pan-tilt heads to multi-axis manipulators.
</p>
<p>In essence, systems suitable for hand-eye calibration are described by a
closed chain of four Euclidean transformations. In this chain two
non-consecutive transformations are either known from the robot controller
or computed from camera data, e.g., calibration object poses observed by
a camera. The two unknown constant transformations are computed by the
hand-eye calibration procedure.
</p>
<p>A hand-eye calibration is performed similarly to the calibration of the
external camera parameters (see <a href="toc_calibration.html">Calibration</a>): You
acquire a set of poses of a calibration object in the camera coordinate
system, and a corresponding set of poses of the tool in robot base
coordinates and set them in the calibration data model <a href="#CalibDataID"><i><code><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></code></i></a>.
</p>
<p>In contrast to the camera calibration, the calibration object is not moved
manually. This task is delegated to the robot. Basically, two hand-eye
calibration scenarios can be distinguished. A robot either moves the camera
(moving camera) or it moves the calibration object (stationary camera).
The robot's movements are assumed to be known. They are used
as an input for the hand-eye calibration and are set in the calibration
data model <a href="#CalibDataID"><i><code><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></code></i></a> using <a href="set_calib_data.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data</span><span data-if="c" style="display:none">set_calib_data</span><span data-if="cpp" style="display:none">SetCalibData</span><span data-if="com" style="display:none">SetCalibData</span><span data-if="dotnet" style="display:none">SetCalibData</span><span data-if="python" style="display:none">set_calib_data</span></code></a>.
</p>
<p>The results of a hand-eye calibration are two poses: For the
moving camera scenario, the 3D pose of the tool in the camera
coordinate system (<i><span data-if="hdevelop" style="display:inline">'tool_in_cam_pose'</span><span data-if="c" style="display:none">"tool_in_cam_pose"</span><span data-if="cpp" style="display:none">"tool_in_cam_pose"</span><span data-if="com" style="display:none">"tool_in_cam_pose"</span><span data-if="dotnet" style="display:none">"tool_in_cam_pose"</span><span data-if="python" style="display:none">"tool_in_cam_pose"</span></i>) and the 3D pose of the
calibration object in the robot base coordinate system
(<i><span data-if="hdevelop" style="display:inline">'obj_in_base_pose'</span><span data-if="c" style="display:none">"obj_in_base_pose"</span><span data-if="cpp" style="display:none">"obj_in_base_pose"</span><span data-if="com" style="display:none">"obj_in_base_pose"</span><span data-if="dotnet" style="display:none">"obj_in_base_pose"</span><span data-if="python" style="display:none">"obj_in_base_pose"</span></i>) are computed. For the stationary camera
scenario, the 3D pose of the robot base in the camera coordinate system
(<i><span data-if="hdevelop" style="display:inline">'base_in_cam_pose'</span><span data-if="c" style="display:none">"base_in_cam_pose"</span><span data-if="cpp" style="display:none">"base_in_cam_pose"</span><span data-if="com" style="display:none">"base_in_cam_pose"</span><span data-if="dotnet" style="display:none">"base_in_cam_pose"</span><span data-if="python" style="display:none">"base_in_cam_pose"</span></i>) and the 3D pose of the calibration object
in the tool coordinate system (<i><span data-if="hdevelop" style="display:inline">'obj_in_tool_pose'</span><span data-if="c" style="display:none">"obj_in_tool_pose"</span><span data-if="cpp" style="display:none">"obj_in_tool_pose"</span><span data-if="com" style="display:none">"obj_in_tool_pose"</span><span data-if="dotnet" style="display:none">"obj_in_tool_pose"</span><span data-if="python" style="display:none">"obj_in_tool_pose"</span></i>) are computed.
Their pose type is identical to the pose type of the input poses. If the
input poses have different pose types, poses of type 0 are returned.
</p>
<p>The two hand-eye calibration scenarios are discussed in more detail below,
followed by general information about the data for and the preparation of
the calibration data model.
</p>
<h3>Moving camera (mounted on a robot)</h3>
<p>In this configuration, the calibration object remains stationary. The
camera is mounted on the robot and is moved to different positions by
the robot. The main idea behind the hand-eye calibration is that the
information extracted from an observation of the calibration object,
i.e., the pose of the calibration object relative to the camera,
can be seen as a chain of poses or homogeneous transformation matrices from
the calibration object via the base of the robot to its tool (end-effector)
and finally to the camera:
</p>
<p><span class="pre">
  Moving camera:   camera_H_cal  =  camera_H_tool * (base_H_tool)^(-1) * base_H_cal
                          |                |               |                   |
                'obj_in_cam_pose' 'tool_in_cam_pose' 'tool_in_base_pose' 'obj_in_base_pose'
</span>
</p>
<p>From the set of calibration object poses (<i><span data-if="hdevelop" style="display:inline">'obj_in_cam_pose'</span><span data-if="c" style="display:none">"obj_in_cam_pose"</span><span data-if="cpp" style="display:none">"obj_in_cam_pose"</span><span data-if="com" style="display:none">"obj_in_cam_pose"</span><span data-if="dotnet" style="display:none">"obj_in_cam_pose"</span><span data-if="python" style="display:none">"obj_in_cam_pose"</span></i>) and
the poses of the tool in the robot base coordinate system
(<i><span data-if="hdevelop" style="display:inline">'tool_in_base_pose'</span><span data-if="c" style="display:none">"tool_in_base_pose"</span><span data-if="cpp" style="display:none">"tool_in_base_pose"</span><span data-if="com" style="display:none">"tool_in_base_pose"</span><span data-if="dotnet" style="display:none">"tool_in_base_pose"</span><span data-if="python" style="display:none">"tool_in_base_pose"</span></i>), 该算子 <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code>
determines the two missing transformations at the ends of the chain, i.e.,
the pose of the robot tool in the camera coordinate system
(<span title="1" style="vertical-align:-0.217917em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="5.26128em" height="1.01195em" viewBox="0 0 84.180466 16.191269">
<!-- Original BoundingBox: -42.090240 -8.095642 42.090225 8.095627 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_109">
      <path style="fill-rule: evenodd;" d="M434.000000 -81.000000C429.000000 -61.000000,420.000000 -27.000000,420.000000 -22.000000C420.000000 -0.000000,438.000000 10.000000,454.000000 10.000000C472.000000 10.000000,488.000000 -3.000000,493.000000 -12.000000C498.000000 -21.000000,506.000000 -53.000000,511.000000 -74.000000C516.000000 -93.000000,527.000000 -139.000000,533.000000 -164.000000C539.000000 -186.000000,545.000000 -208.000000,550.000000 -231.000000C561.000000 -274.000000,561.000000 -276.000000,581.000000 -307.000000C613.000000 -356.000000,663.000000 -413.000000,741.000000 -413.000000C797.000000 -413.000000,800.000000 -367.000000,800.000000 -343.000000C800.000000 -283.000000,757.000000 -172.000000,741.000000 -130.000000C730.000000 -102.000000,726.000000 -93.000000,726.000000 -76.000000C726.000000 -23.000000,770.000000 10.000000,821.000000 10.000000C921.000000 10.000000,965.000000 -128.000000,965.000000 -143.000000C965.000000 -156.000000,952.000000 -156.000000,949.000000 -156.000000C935.000000 -156.000000,934.000000 -150.000000,930.000000 -139.000000C907.000000 -59.000000,864.000000 -18.000000,824.000000 -18.000000C803.000000 -18.000000,799.000000 -32.000000,799.000000 -53.000000C799.000000 -76.000000,804.000000 -89.000000,822.000000 -134.000000C834.000000 -165.000000,875.000000 -271.000000,875.000000 -327.000000C875.000000 -343.000000,875.000000 -385.000000,838.000000 -414.000000C821.000000 -427.000000,792.000000 -441.000000,745.000000 -441.000000C655.000000 -441.000000,600.000000 -382.000000,568.000000 -340.000000C560.000000 -425.000000,489.000000 -441.000000,438.000000 -441.000000C355.000000 -441.000000,299.000000 -390.000000,269.000000 -350.000000C262.000000 -419.000000,203.000000 -441.000000,162.000000 -441.000000C119.000000 -441.000000,96.000000 -410.000000,83.000000 -387.000000C61.000000 -350.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -364.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C164.000000 10.000000,180.000000 -3.000000,185.000000 -12.000000C190.000000 -21.000000,198.000000 -53.000000,203.000000 -74.000000C208.000000 -93.000000,219.000000 -139.000000,225.000000 -164.000000C231.000000 -186.000000,237.000000 -208.000000,242.000000 -231.000000C253.000000 -272.000000,255.000000 -280.000000,284.000000 -321.000000C312.000000 -361.000000,359.000000 -413.000000,434.000000 -413.000000C492.000000 -413.000000,493.000000 -362.000000,493.000000 -343.000000C493.000000 -318.000000,490.000000 -305.000000,476.000000 -249.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_114">
      <path style="fill-rule: evenodd;" d="M235.000000 -202.000000C236.000000 -208.000000,259.000000 -298.000000,261.000000 -303.000000C263.000000 -311.000000,292.000000 -361.000000,324.000000 -385.000000C335.000000 -393.000000,362.000000 -413.000000,405.000000 -413.000000C415.000000 -413.000000,440.000000 -412.000000,460.000000 -399.000000C428.000000 -390.000000,416.000000 -362.000000,416.000000 -344.000000C416.000000 -322.000000,433.000000 -307.000000,456.000000 -307.000000C479.000000 -307.000000,512.000000 -326.000000,512.000000 -368.000000C512.000000 -420.000000,457.000000 -441.000000,406.000000 -441.000000C354.000000 -441.000000,309.000000 -420.000000,265.000000 -370.000000C247.000000 -431.000000,186.000000 -441.000000,162.000000 -441.000000C125.000000 -441.000000,100.000000 -418.000000,84.000000 -390.000000C61.000000 -351.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -366.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C161.000000 10.000000,181.000000 1.000000,189.000000 -19.000000C191.000000 -25.000000,202.000000 -69.000000,208.000000 -94.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.925751 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,7.546432 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_109" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="11.433943"></use>
    <use xlink:href="#GLYPHcmmi7_114" x="15.228129"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,38.081894 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,45.793274 12.704590)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,60.139435 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,65.613373 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
</svg></span>,
<i><span data-if="hdevelop" style="display:inline">'tool_in_cam_pose'</span><span data-if="c" style="display:none">"tool_in_cam_pose"</span><span data-if="cpp" style="display:none">"tool_in_cam_pose"</span><span data-if="com" style="display:none">"tool_in_cam_pose"</span><span data-if="dotnet" style="display:none">"tool_in_cam_pose"</span><span data-if="python" style="display:none">"tool_in_cam_pose"</span></i>) and the pose of the calibration object in
the robot base coordinate system
(<span title="2" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="3.83138em" height="1.19599em" viewBox="0 0 61.302155 19.135910">
<!-- Original BoundingBox: -30.651077 -9.567963 30.651077 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.364914 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,7.101273 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,26.877029 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,41.223145 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,47.843979 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="4.337713"></use>
  </g>
</svg></span>, <i><span data-if="hdevelop" style="display:inline">'obj_in_base_pose'</span><span data-if="c" style="display:none">"obj_in_base_pose"</span><span data-if="cpp" style="display:none">"obj_in_base_pose"</span><span data-if="com" style="display:none">"obj_in_base_pose"</span><span data-if="dotnet" style="display:none">"obj_in_base_pose"</span><span data-if="python" style="display:none">"obj_in_base_pose"</span></i>).
These two poses are constant.
</p>
<p>In contrast, the transformation in the middle of the chain,
<span title="3" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4.11405em" height="1.19599em" viewBox="0 0 65.824875 19.135910">
<!-- Original BoundingBox: -32.912445 -9.567963 32.912430 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.103546 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,6.839905 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,26.615662 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,40.961777 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,46.435730 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
</svg></span>, is known but changes
for each observation of the calibration object, because it describes
the pose of the tool with respect to the robot base coordinate system.
In the equation the inverted transformation matrix is used. The inversion
is performed internally.
</p>
<p>Note that when calibrating SCARA robots, it is not possible to determine
the Z translation of <i><span data-if="hdevelop" style="display:inline">'obj_in_base_pose'</span><span data-if="c" style="display:none">"obj_in_base_pose"</span><span data-if="cpp" style="display:none">"obj_in_base_pose"</span><span data-if="com" style="display:none">"obj_in_base_pose"</span><span data-if="dotnet" style="display:none">"obj_in_base_pose"</span><span data-if="python" style="display:none">"obj_in_base_pose"</span></i>. To eliminate this
ambiguity the Z translation <i><span data-if="hdevelop" style="display:inline">'obj_in_base_pose'</span><span data-if="c" style="display:none">"obj_in_base_pose"</span><span data-if="cpp" style="display:none">"obj_in_base_pose"</span><span data-if="com" style="display:none">"obj_in_base_pose"</span><span data-if="dotnet" style="display:none">"obj_in_base_pose"</span><span data-if="python" style="display:none">"obj_in_base_pose"</span></i> is internally
set to 0.0 and the <i><span data-if="hdevelop" style="display:inline">'tool_in_cam_pose'</span><span data-if="c" style="display:none">"tool_in_cam_pose"</span><span data-if="cpp" style="display:none">"tool_in_cam_pose"</span><span data-if="com" style="display:none">"tool_in_cam_pose"</span><span data-if="dotnet" style="display:none">"tool_in_cam_pose"</span><span data-if="python" style="display:none">"tool_in_cam_pose"</span></i> is calculated accordingly.
It is necessary to determine the true translation in Z after the
calibration by moving the robot to a pose of
known height in the camera coordinate system. For this, the following
approach can be applied: The calibration plate is placed at an arbitrary
position. The robot is then moved such that the camera can observe the
calibration plate. Now, an image of the calibration plate is acquired and
the current robot pose is queried (<i>ToolInBasePose1</i>). From the
image, the pose of the calibration plate in the camera coordinate system can
be determined (<i>ObjInCamPose1</i>). Afterwards, the tool of the robot
is manually moved to the origin of the calibration plate and the robot
pose is queried again (<i>ToolInBasePose2</i>). These three poses and
the result of the calibration (<i>ToolInCamPose</i>) can be used to fix
the Z ambiguity by using the following lines of code:
</p>
<div style="text-align:center"><table style="width:90%;margin-left:auto;margin-right:auto" class="layout">
<col span="1" style="width:90%;">
<tr><td style="text-align:left">
<a href="pose_invert.html"><code><span data-if="hdevelop" style="display:inline">pose_invert(ToolInCamPose, CamInToolPose)</span><span data-if="c" style="display:none">pose_invert(ToolInCamPose, CamInToolPose)</span><span data-if="cpp" style="display:none">PoseInvert(ToolInCamPose, CamInToolPose)</span><span data-if="com" style="display:none">PoseInvert(ToolInCamPose, CamInToolPose)</span><span data-if="dotnet" style="display:none">PoseInvert(ToolInCamPose, CamInToolPose)</span><span data-if="python" style="display:none">pose_invert(ToolInCamPose, CamInToolPose)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="pose_compose.html"><code><span data-if="hdevelop" style="display:inline">pose_compose(CamInToolPose, ObjInCamPose1, ObjInToolPose1)</span><span data-if="c" style="display:none">pose_compose(CamInToolPose, ObjInCamPose1, ObjInToolPose1)</span><span data-if="cpp" style="display:none">PoseCompose(CamInToolPose, ObjInCamPose1, ObjInToolPose1)</span><span data-if="com" style="display:none">PoseCompose(CamInToolPose, ObjInCamPose1, ObjInToolPose1)</span><span data-if="dotnet" style="display:none">PoseCompose(CamInToolPose, ObjInCamPose1, ObjInToolPose1)</span><span data-if="python" style="display:none">pose_compose(CamInToolPose, ObjInCamPose1, ObjInToolPose1)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="pose_invert.html"><code><span data-if="hdevelop" style="display:inline">pose_invert(ToolInBasePose1, BaseInToolPose1)</span><span data-if="c" style="display:none">pose_invert(ToolInBasePose1, BaseInToolPose1)</span><span data-if="cpp" style="display:none">PoseInvert(ToolInBasePose1, BaseInToolPose1)</span><span data-if="com" style="display:none">PoseInvert(ToolInBasePose1, BaseInToolPose1)</span><span data-if="dotnet" style="display:none">PoseInvert(ToolInBasePose1, BaseInToolPose1)</span><span data-if="python" style="display:none">pose_invert(ToolInBasePose1, BaseInToolPose1)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="pose_compose.html"><code><span data-if="hdevelop" style="display:inline">pose_compose(BaseInToolPose1, ToolInBasePose2, Tool2InTool1Pose)</span><span data-if="c" style="display:none">pose_compose(BaseInToolPose1, ToolInBasePose2, Tool2InTool1Pose)</span><span data-if="cpp" style="display:none">PoseCompose(BaseInToolPose1, ToolInBasePose2, Tool2InTool1Pose)</span><span data-if="com" style="display:none">PoseCompose(BaseInToolPose1, ToolInBasePose2, Tool2InTool1Pose)</span><span data-if="dotnet" style="display:none">PoseCompose(BaseInToolPose1, ToolInBasePose2, Tool2InTool1Pose)</span><span data-if="python" style="display:none">pose_compose(BaseInToolPose1, ToolInBasePose2, Tool2InTool1Pose)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<code>ZCorrection := ObjInToolPose1[2]-Tool2InTool1Pose[2]</code>
</td></tr>
<tr><td style="text-align:left">
<a href="set_origin_pose.html"><code><span data-if="hdevelop" style="display:inline">set_origin_pose(ToolInCamPose, 0, 0, ZCorrection, ToolInCamPoseFinal)</span><span data-if="c" style="display:none">set_origin_pose(ToolInCamPose, 0, 0, ZCorrection, ToolInCamPoseFinal)</span><span data-if="cpp" style="display:none">SetOriginPose(ToolInCamPose, 0, 0, ZCorrection, ToolInCamPoseFinal)</span><span data-if="com" style="display:none">SetOriginPose(ToolInCamPose, 0, 0, ZCorrection, ToolInCamPoseFinal)</span><span data-if="dotnet" style="display:none">SetOriginPose(ToolInCamPose, 0, 0, ZCorrection, ToolInCamPoseFinal)</span><span data-if="python" style="display:none">set_origin_pose(ToolInCamPose, 0, 0, ZCorrection, ToolInCamPoseFinal)</span></code></a>
</td></tr>
</table></div>
<p>The <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i> also estimates the
uncertainty of observations. Besides the input poses described above,
it also uses the extracted calibration marks and is thus only available
for use with a camera and a calibration plate, not for use with a 3D sensor.
For articulated robots, the hand-eye poses and camera parameters are refined
simultaneously.
</p>
<h3>Stationary camera</h3>
<p>In this configuration, the robot grasps the calibration object and moves
it in front of the camera. Again, the information extracted from an
observation of the calibration object, i.e., the pose of the calibration
object in the camera coordinate system (e.g., the external camera
parameters), are equal to a chain of poses or homogeneous transformation
matrices, this time from the calibration object via the robot's tool to
its base and finally to the camera:
</p>
<p><span class="pre">
  Stationary camera:  camera_H_cal  =  camera_H_base  *  base_H_tool  *  tool_H_cal
                             |                |               |               |
                   'obj_in_cam_pose' 'base_in_cam_pose' 'tool_in_base_pose' 'obj_in_tool_pose'
</span>
</p>
<p>Analogously to the configuration with a moving camera, 该算子
<code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code> determines the two transformations at the ends
of the chain, here the pose of the robot base coordinate system in camera
coordinates (<span title="4" style="vertical-align:-0.217917em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="5.48386em" height="1.01195em" viewBox="0 0 87.741760 16.191269">
<!-- Original BoundingBox: -43.870880 -8.095642 43.870880 8.095627 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_109">
      <path style="fill-rule: evenodd;" d="M434.000000 -81.000000C429.000000 -61.000000,420.000000 -27.000000,420.000000 -22.000000C420.000000 -0.000000,438.000000 10.000000,454.000000 10.000000C472.000000 10.000000,488.000000 -3.000000,493.000000 -12.000000C498.000000 -21.000000,506.000000 -53.000000,511.000000 -74.000000C516.000000 -93.000000,527.000000 -139.000000,533.000000 -164.000000C539.000000 -186.000000,545.000000 -208.000000,550.000000 -231.000000C561.000000 -274.000000,561.000000 -276.000000,581.000000 -307.000000C613.000000 -356.000000,663.000000 -413.000000,741.000000 -413.000000C797.000000 -413.000000,800.000000 -367.000000,800.000000 -343.000000C800.000000 -283.000000,757.000000 -172.000000,741.000000 -130.000000C730.000000 -102.000000,726.000000 -93.000000,726.000000 -76.000000C726.000000 -23.000000,770.000000 10.000000,821.000000 10.000000C921.000000 10.000000,965.000000 -128.000000,965.000000 -143.000000C965.000000 -156.000000,952.000000 -156.000000,949.000000 -156.000000C935.000000 -156.000000,934.000000 -150.000000,930.000000 -139.000000C907.000000 -59.000000,864.000000 -18.000000,824.000000 -18.000000C803.000000 -18.000000,799.000000 -32.000000,799.000000 -53.000000C799.000000 -76.000000,804.000000 -89.000000,822.000000 -134.000000C834.000000 -165.000000,875.000000 -271.000000,875.000000 -327.000000C875.000000 -343.000000,875.000000 -385.000000,838.000000 -414.000000C821.000000 -427.000000,792.000000 -441.000000,745.000000 -441.000000C655.000000 -441.000000,600.000000 -382.000000,568.000000 -340.000000C560.000000 -425.000000,489.000000 -441.000000,438.000000 -441.000000C355.000000 -441.000000,299.000000 -390.000000,269.000000 -350.000000C262.000000 -419.000000,203.000000 -441.000000,162.000000 -441.000000C119.000000 -441.000000,96.000000 -410.000000,83.000000 -387.000000C61.000000 -350.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -364.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C164.000000 10.000000,180.000000 -3.000000,185.000000 -12.000000C190.000000 -21.000000,198.000000 -53.000000,203.000000 -74.000000C208.000000 -93.000000,219.000000 -139.000000,225.000000 -164.000000C231.000000 -186.000000,237.000000 -208.000000,242.000000 -231.000000C253.000000 -272.000000,255.000000 -280.000000,284.000000 -321.000000C312.000000 -361.000000,359.000000 -413.000000,434.000000 -413.000000C492.000000 -413.000000,493.000000 -362.000000,493.000000 -343.000000C493.000000 -318.000000,490.000000 -305.000000,476.000000 -249.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_114">
      <path style="fill-rule: evenodd;" d="M235.000000 -202.000000C236.000000 -208.000000,259.000000 -298.000000,261.000000 -303.000000C263.000000 -311.000000,292.000000 -361.000000,324.000000 -385.000000C335.000000 -393.000000,362.000000 -413.000000,405.000000 -413.000000C415.000000 -413.000000,440.000000 -412.000000,460.000000 -399.000000C428.000000 -390.000000,416.000000 -362.000000,416.000000 -344.000000C416.000000 -322.000000,433.000000 -307.000000,456.000000 -307.000000C479.000000 -307.000000,512.000000 -326.000000,512.000000 -368.000000C512.000000 -420.000000,457.000000 -441.000000,406.000000 -441.000000C354.000000 -441.000000,309.000000 -420.000000,265.000000 -370.000000C247.000000 -431.000000,186.000000 -441.000000,162.000000 -441.000000C125.000000 -441.000000,100.000000 -418.000000,84.000000 -390.000000C61.000000 -351.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -366.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C161.000000 10.000000,181.000000 1.000000,189.000000 -19.000000C191.000000 -25.000000,202.000000 -69.000000,208.000000 -94.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.145111 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,6.765793 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_109" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="11.433943"></use>
    <use xlink:href="#GLYPHcmmi7_114" x="15.228129"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,37.301254 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,45.012634 12.704590)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,59.358795 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,66.095291 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
</svg></span>,
<i><span data-if="hdevelop" style="display:inline">'base_in_cam_pose'</span><span data-if="c" style="display:none">"base_in_cam_pose"</span><span data-if="cpp" style="display:none">"base_in_cam_pose"</span><span data-if="com" style="display:none">"base_in_cam_pose"</span><span data-if="dotnet" style="display:none">"base_in_cam_pose"</span><span data-if="python" style="display:none">"base_in_cam_pose"</span></i>) and the pose of the calibration object
relative to the robot tool (<span title="5" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="3.6088em" height="1.19599em" viewBox="0 0 57.740860 19.135910">
<!-- Original BoundingBox: -28.870438 -9.567963 28.870422 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.145554 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,5.619507 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,23.096207 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,37.442352 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,44.063171 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="4.337713"></use>
  </g>
</svg></span>,
<i><span data-if="hdevelop" style="display:inline">'obj_in_tool_pose'</span><span data-if="c" style="display:none">"obj_in_tool_pose"</span><span data-if="cpp" style="display:none">"obj_in_tool_pose"</span><span data-if="com" style="display:none">"obj_in_tool_pose"</span><span data-if="dotnet" style="display:none">"obj_in_tool_pose"</span><span data-if="python" style="display:none">"obj_in_tool_pose"</span></i>).
</p>
<p>The transformation in the middle of the chain,
<span title="6" style="vertical-align:-0.247437em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4.11405em" height="1.19599em" viewBox="0 0 65.824875 19.135910">
<!-- Original BoundingBox: -32.912445 -9.567963 32.912430 9.567947 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_111">
      <path style="fill-rule: evenodd;" d="M531.000000 -266.000000C531.000000 -377.000000,448.000000 -441.000000,350.000000 -441.000000C202.000000 -441.000000,62.000000 -302.000000,62.000000 -165.000000C62.000000 -65.000000,135.000000 10.000000,244.000000 10.000000C387.000000 10.000000,531.000000 -122.000000,531.000000 -266.000000M245.000000 -18.000000C195.000000 -18.000000,145.000000 -50.000000,145.000000 -129.000000C145.000000 -170.000000,164.000000 -268.000000,203.000000 -325.000000C246.000000 -387.000000,304.000000 -413.000000,349.000000 -413.000000C403.000000 -413.000000,449.000000 -376.000000,449.000000 -302.000000C449.000000 -278.000000,437.000000 -179.000000,393.000000 -109.000000C355.000000 -50.000000,295.000000 -18.000000,245.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_115">
      <path style="fill-rule: evenodd;" d="M431.000000 -376.000000C405.000000 -370.000000,389.000000 -349.000000,389.000000 -329.000000C389.000000 -306.000000,409.000000 -297.000000,422.000000 -297.000000C432.000000 -297.000000,470.000000 -303.000000,470.000000 -354.000000C470.000000 -419.000000,398.000000 -441.000000,337.000000 -441.000000C181.000000 -441.000000,153.000000 -326.000000,153.000000 -295.000000C153.000000 -258.000000,174.000000 -234.000000,188.000000 -222.000000C214.000000 -202.000000,232.000000 -198.000000,301.000000 -186.000000C322.000000 -182.000000,386.000000 -170.000000,386.000000 -120.000000C386.000000 -103.000000,375.000000 -65.000000,333.000000 -40.000000C294.000000 -18.000000,245.000000 -18.000000,233.000000 -18.000000C193.000000 -18.000000,136.000000 -27.000000,113.000000 -60.000000C146.000000 -64.000000,168.000000 -89.000000,168.000000 -117.000000C168.000000 -142.000000,150.000000 -154.000000,129.000000 -154.000000C100.000000 -154.000000,71.000000 -131.000000,71.000000 -87.000000C71.000000 -27.000000,135.000000 10.000000,232.000000 10.000000C416.000000 10.000000,450.000000 -116.000000,450.000000 -155.000000C450.000000 -247.000000,349.000000 -265.000000,312.000000 -272.000000C303.000000 -274.000000,278.000000 -278.000000,272.000000 -280.000000C235.000000 -287.000000,217.000000 -308.000000,217.000000 -330.000000C217.000000 -353.000000,235.000000 -380.000000,257.000000 -394.000000C284.000000 -411.000000,319.000000 -413.000000,336.000000 -413.000000C357.000000 -413.000000,409.000000 -410.000000,431.000000 -376.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_98">
      <path style="fill-rule: evenodd;" d="M329.000000 -665.000000C330.000000 -669.000000,332.000000 -676.000000,332.000000 -680.000000C332.000000 -695.000000,316.000000 -694.000000,305.000000 -693.000000L197.000000 -684.000000C184.000000 -683.000000,171.000000 -682.000000,171.000000 -661.000000C171.000000 -647.000000,184.000000 -647.000000,197.000000 -647.000000C245.000000 -647.000000,245.000000 -640.000000,245.000000 -631.000000C245.000000 -625.000000,245.000000 -623.000000,241.000000 -609.000000L144.000000 -223.000000C135.000000 -187.000000,135.000000 -164.000000,135.000000 -151.000000C135.000000 -45.000000,200.000000 10.000000,272.000000 10.000000C395.000000 10.000000,521.000000 -133.000000,521.000000 -278.000000C521.000000 -378.000000,458.000000 -441.000000,379.000000 -441.000000C325.000000 -441.000000,283.000000 -408.000000,260.000000 -390.000000M273.000000 -18.000000C231.000000 -18.000000,201.000000 -54.000000,201.000000 -119.000000C201.000000 -172.000000,238.000000 -306.000000,244.000000 -316.000000C274.000000 -364.000000,327.000000 -413.000000,377.000000 -413.000000C424.000000 -413.000000,445.000000 -367.000000,445.000000 -319.000000C445.000000 -273.000000,417.000000 -161.000000,392.000000 -114.000000C355.000000 -44.000000,305.000000 -18.000000,273.000000 -18.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_116">
      <path style="fill-rule: evenodd;" d="M290.000000 -395.000000L389.000000 -395.000000C407.000000 -395.000000,419.000000 -395.000000,419.000000 -417.000000C419.000000 -431.000000,407.000000 -431.000000,391.000000 -431.000000L299.000000 -431.000000L335.000000 -575.000000C339.000000 -589.000000,339.000000 -591.000000,339.000000 -595.000000C339.000000 -613.000000,325.000000 -625.000000,307.000000 -625.000000C273.000000 -625.000000,265.000000 -592.000000,263.000000 -583.000000L225.000000 -431.000000L126.000000 -431.000000C108.000000 -431.000000,96.000000 -431.000000,96.000000 -409.000000C96.000000 -395.000000,108.000000 -395.000000,124.000000 -395.000000L216.000000 -395.000000L147.000000 -118.000000C142.000000 -98.000000,142.000000 -91.000000,142.000000 -84.000000C142.000000 -22.000000,191.000000 10.000000,243.000000 10.000000C351.000000 10.000000,415.000000 -128.000000,415.000000 -144.000000C415.000000 -156.000000,402.000000 -156.000000,395.000000 -156.000000C379.000000 -156.000000,378.000000 -154.000000,372.000000 -140.000000C325.000000 -34.000000,273.000000 -18.000000,246.000000 -18.000000C212.000000 -18.000000,212.000000 -55.000000,212.000000 -65.000000C212.000000 -82.000000,217.000000 -103.000000,218.000000 -106.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.103546 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_98"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,6.839905 8.180893)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_115" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="8.112095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,26.615662 15.176910)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,40.961777 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_116"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,46.435730 17.567963)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_111"></use>
    <use xlink:href="#GLYPHcmmi7_111" x="3.947287"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="7.894574"></use>
  </g>
</svg></span>, describes the pose of
the tool relative to the robot base coordinate system. The transformation
<span title="7" style="vertical-align:-0.217917em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="4.9786em" height="1.01195em" viewBox="0 0 79.657578 16.191269">
<!-- Original BoundingBox: -39.828796 -8.095642 39.828781 8.095627 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_97">
      <path style="fill-rule: evenodd;" d="M422.000000 -382.000000C401.000000 -415.000000,367.000000 -441.000000,319.000000 -441.000000C191.000000 -441.000000,61.000000 -300.000000,61.000000 -156.000000C61.000000 -59.000000,126.000000 10.000000,212.000000 10.000000C266.000000 10.000000,314.000000 -21.000000,354.000000 -60.000000C373.000000 -0.000000,431.000000 10.000000,457.000000 10.000000C493.000000 10.000000,518.000000 -12.000000,536.000000 -43.000000C558.000000 -82.000000,571.000000 -139.000000,571.000000 -143.000000C571.000000 -156.000000,558.000000 -156.000000,555.000000 -156.000000C541.000000 -156.000000,540.000000 -152.000000,533.000000 -125.000000C521.000000 -77.000000,502.000000 -18.000000,460.000000 -18.000000C434.000000 -18.000000,427.000000 -40.000000,427.000000 -67.000000C427.000000 -84.000000,435.000000 -120.000000,442.000000 -146.000000C449.000000 -173.000000,459.000000 -214.000000,464.000000 -236.000000L484.000000 -312.000000C490.000000 -338.000000,502.000000 -385.000000,502.000000 -390.000000C502.000000 -412.000000,484.000000 -422.000000,468.000000 -422.000000C451.000000 -422.000000,428.000000 -410.000000,422.000000 -382.000000M358.000000 -125.000000C351.000000 -97.000000,329.000000 -77.000000,307.000000 -58.000000C298.000000 -50.000000,258.000000 -18.000000,215.000000 -18.000000C178.000000 -18.000000,142.000000 -44.000000,142.000000 -115.000000C142.000000 -168.000000,171.000000 -278.000000,194.000000 -318.000000C240.000000 -398.000000,291.000000 -413.000000,319.000000 -413.000000C389.000000 -413.000000,408.000000 -337.000000,408.000000 -326.000000C408.000000 -322.000000,406.000000 -315.000000,405.000000 -312.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_101">
      <path style="fill-rule: evenodd;" d="M224.000000 -228.000000C252.000000 -228.000000,331.000000 -230.000000,385.000000 -249.000000C459.000000 -275.000000,473.000000 -323.000000,473.000000 -353.000000C473.000000 -408.000000,418.000000 -441.000000,349.000000 -441.000000C229.000000 -441.000000,67.000000 -349.000000,67.000000 -178.000000C67.000000 -77.000000,130.000000 10.000000,247.000000 10.000000C416.000000 10.000000,495.000000 -89.000000,495.000000 -103.000000C495.000000 -109.000000,486.000000 -120.000000,478.000000 -120.000000C472.000000 -120.000000,470.000000 -118.000000,462.000000 -110.000000C384.000000 -18.000000,267.000000 -18.000000,249.000000 -18.000000C189.000000 -18.000000,149.000000 -58.000000,149.000000 -139.000000C149.000000 -153.000000,149.000000 -173.000000,161.000000 -228.000000M169.000000 -256.000000C210.000000 -401.000000,321.000000 -413.000000,349.000000 -413.000000C393.000000 -413.000000,430.000000 -391.000000,430.000000 -353.000000C430.000000 -256.000000,261.000000 -256.000000,218.000000 -256.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_108">
      <path style="fill-rule: evenodd;" d="M282.000000 -664.000000C283.000000 -666.000000,286.000000 -679.000000,286.000000 -680.000000C286.000000 -685.000000,282.000000 -694.000000,270.000000 -694.000000C250.000000 -694.000000,167.000000 -686.000000,142.000000 -684.000000C135.000000 -683.000000,121.000000 -682.000000,121.000000 -661.000000C121.000000 -647.000000,135.000000 -647.000000,146.000000 -647.000000C194.000000 -647.000000,194.000000 -640.000000,194.000000 -632.000000C194.000000 -625.000000,192.000000 -619.000000,190.000000 -610.000000L66.000000 -116.000000C63.000000 -106.000000,62.000000 -95.000000,62.000000 -85.000000C62.000000 -21.000000,119.000000 10.000000,167.000000 10.000000C191.000000 10.000000,221.000000 2.000000,247.000000 -43.000000C268.000000 -80.000000,282.000000 -139.000000,282.000000 -143.000000C282.000000 -156.000000,269.000000 -156.000000,266.000000 -156.000000C252.000000 -156.000000,250.000000 -150.000000,246.000000 -132.000000C233.000000 -82.000000,214.000000 -18.000000,171.000000 -18.000000C144.000000 -18.000000,137.000000 -43.000000,137.000000 -67.000000C137.000000 -78.000000,140.000000 -97.000000,143.000000 -108.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_109">
      <path style="fill-rule: evenodd;" d="M434.000000 -81.000000C429.000000 -61.000000,420.000000 -27.000000,420.000000 -22.000000C420.000000 -0.000000,438.000000 10.000000,454.000000 10.000000C472.000000 10.000000,488.000000 -3.000000,493.000000 -12.000000C498.000000 -21.000000,506.000000 -53.000000,511.000000 -74.000000C516.000000 -93.000000,527.000000 -139.000000,533.000000 -164.000000C539.000000 -186.000000,545.000000 -208.000000,550.000000 -231.000000C561.000000 -274.000000,561.000000 -276.000000,581.000000 -307.000000C613.000000 -356.000000,663.000000 -413.000000,741.000000 -413.000000C797.000000 -413.000000,800.000000 -367.000000,800.000000 -343.000000C800.000000 -283.000000,757.000000 -172.000000,741.000000 -130.000000C730.000000 -102.000000,726.000000 -93.000000,726.000000 -76.000000C726.000000 -23.000000,770.000000 10.000000,821.000000 10.000000C921.000000 10.000000,965.000000 -128.000000,965.000000 -143.000000C965.000000 -156.000000,952.000000 -156.000000,949.000000 -156.000000C935.000000 -156.000000,934.000000 -150.000000,930.000000 -139.000000C907.000000 -59.000000,864.000000 -18.000000,824.000000 -18.000000C803.000000 -18.000000,799.000000 -32.000000,799.000000 -53.000000C799.000000 -76.000000,804.000000 -89.000000,822.000000 -134.000000C834.000000 -165.000000,875.000000 -271.000000,875.000000 -327.000000C875.000000 -343.000000,875.000000 -385.000000,838.000000 -414.000000C821.000000 -427.000000,792.000000 -441.000000,745.000000 -441.000000C655.000000 -441.000000,600.000000 -382.000000,568.000000 -340.000000C560.000000 -425.000000,489.000000 -441.000000,438.000000 -441.000000C355.000000 -441.000000,299.000000 -390.000000,269.000000 -350.000000C262.000000 -419.000000,203.000000 -441.000000,162.000000 -441.000000C119.000000 -441.000000,96.000000 -410.000000,83.000000 -387.000000C61.000000 -350.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -364.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C164.000000 10.000000,180.000000 -3.000000,185.000000 -12.000000C190.000000 -21.000000,198.000000 -53.000000,203.000000 -74.000000C208.000000 -93.000000,219.000000 -139.000000,225.000000 -164.000000C231.000000 -186.000000,237.000000 -208.000000,242.000000 -231.000000C253.000000 -272.000000,255.000000 -280.000000,284.000000 -321.000000C312.000000 -361.000000,359.000000 -413.000000,434.000000 -413.000000C492.000000 -413.000000,493.000000 -362.000000,493.000000 -343.000000C493.000000 -318.000000,490.000000 -305.000000,476.000000 -249.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_114">
      <path style="fill-rule: evenodd;" d="M235.000000 -202.000000C236.000000 -208.000000,259.000000 -298.000000,261.000000 -303.000000C263.000000 -311.000000,292.000000 -361.000000,324.000000 -385.000000C335.000000 -393.000000,362.000000 -413.000000,405.000000 -413.000000C415.000000 -413.000000,440.000000 -412.000000,460.000000 -399.000000C428.000000 -390.000000,416.000000 -362.000000,416.000000 -344.000000C416.000000 -322.000000,433.000000 -307.000000,456.000000 -307.000000C479.000000 -307.000000,512.000000 -326.000000,512.000000 -368.000000C512.000000 -420.000000,457.000000 -441.000000,406.000000 -441.000000C354.000000 -441.000000,309.000000 -420.000000,265.000000 -370.000000C247.000000 -431.000000,186.000000 -441.000000,162.000000 -441.000000C125.000000 -441.000000,100.000000 -418.000000,84.000000 -390.000000C61.000000 -351.000000,47.000000 -293.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -278.000000,86.000000 -305.000000C101.000000 -366.000000,120.000000 -413.000000,159.000000 -413.000000C185.000000 -413.000000,192.000000 -391.000000,192.000000 -364.000000C192.000000 -345.000000,183.000000 -308.000000,176.000000 -281.000000C169.000000 -254.000000,159.000000 -213.000000,154.000000 -191.000000L122.000000 -63.000000C118.000000 -50.000000,112.000000 -25.000000,112.000000 -22.000000C112.000000 -0.000000,130.000000 10.000000,146.000000 10.000000C161.000000 10.000000,181.000000 1.000000,189.000000 -19.000000C191.000000 -25.000000,202.000000 -69.000000,208.000000 -94.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_72">
      <path style="fill-rule: evenodd;" d="M752.000000 -639.000000L860.000000 -639.000000L860.000000 -686.000000L681.000000 -686.000000L822.000000 -683.000000L724.000000 -683.000000L681.000000 -683.000000L638.000000 -683.000000L540.000000 -683.000000L502.000000 -686.000000L502.000000 -639.000000L610.000000 -639.000000L610.000000 -380.000000L289.000000 -380.000000L289.000000 -639.000000L397.000000 -639.000000L397.000000 -686.000000L218.000000 -686.000000L359.000000 -683.000000L261.000000 -683.000000L218.000000 -683.000000L175.000000 -683.000000L77.000000 -683.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L218.000000 -0.000000L77.000000 -3.000000L175.000000 -3.000000L218.000000 -3.000000L261.000000 -3.000000L359.000000 -3.000000L397.000000 -0.000000L397.000000 -47.000000L289.000000 -47.000000L289.000000 -333.000000L610.000000 -333.000000L610.000000 -47.000000L502.000000 -47.000000L502.000000 -0.000000L681.000000 -0.000000L540.000000 -3.000000L638.000000 -3.000000L681.000000 -3.000000L724.000000 -3.000000L822.000000 -3.000000L860.000000 -0.000000L860.000000 -47.000000L752.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmti7_99">
      <path style="fill-rule: evenodd;" d="M485.000000 -377.000000C456.000000 -369.000000,446.000000 -345.000000,446.000000 -328.000000C446.000000 -312.000000,457.000000 -295.000000,482.000000 -295.000000C499.000000 -295.000000,532.000000 -306.000000,532.000000 -354.000000C532.000000 -419.000000,462.000000 -441.000000,407.000000 -441.000000C267.000000 -441.000000,130.000000 -304.000000,130.000000 -162.000000C130.000000 -68.000000,193.000000 10.000000,304.000000 10.000000C465.000000 10.000000,541.000000 -84.000000,541.000000 -97.000000C541.000000 -105.000000,527.000000 -121.000000,518.000000 -121.000000C513.000000 -121.000000,510.000000 -118.000000,503.000000 -110.000000C442.000000 -37.000000,355.000000 -18.000000,305.000000 -18.000000C255.000000 -18.000000,209.000000 -47.000000,209.000000 -128.000000C209.000000 -175.000000,231.000000 -281.000000,277.000000 -339.000000C317.000000 -390.000000,365.000000 -413.000000,408.000000 -413.000000C425.000000 -413.000000,468.000000 -408.000000,485.000000 -377.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.187195 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,6.807877 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_109" x="4.337713"></use>
    <use xlink:href="#GLYPHcmmi7_101" x="11.433943"></use>
    <use xlink:href="#GLYPHcmmi7_114" x="15.228129"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,37.343338 5.708572)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,45.054718 12.704590)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_72"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,59.400879 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmti7_99"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,66.021698 15.095642)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_97"></use>
    <use xlink:href="#GLYPHcmmi7_108" x="4.337713"></use>
  </g>
</svg></span> describes the pose of the
calibration object relative to the camera coordinate system.
</p>
<p>Note that when calibrating SCARA robots, it is not possible to determine
the Z translation of <i><span data-if="hdevelop" style="display:inline">'obj_in_tool_pose'</span><span data-if="c" style="display:none">"obj_in_tool_pose"</span><span data-if="cpp" style="display:none">"obj_in_tool_pose"</span><span data-if="com" style="display:none">"obj_in_tool_pose"</span><span data-if="dotnet" style="display:none">"obj_in_tool_pose"</span><span data-if="python" style="display:none">"obj_in_tool_pose"</span></i>. To eliminate this
ambiguity the Z translation of <i><span data-if="hdevelop" style="display:inline">'obj_in_tool_pose'</span><span data-if="c" style="display:none">"obj_in_tool_pose"</span><span data-if="cpp" style="display:none">"obj_in_tool_pose"</span><span data-if="com" style="display:none">"obj_in_tool_pose"</span><span data-if="dotnet" style="display:none">"obj_in_tool_pose"</span><span data-if="python" style="display:none">"obj_in_tool_pose"</span></i> is internally
set to 0.0 and the <i><span data-if="hdevelop" style="display:inline">'base_in_cam_pose'</span><span data-if="c" style="display:none">"base_in_cam_pose"</span><span data-if="cpp" style="display:none">"base_in_cam_pose"</span><span data-if="com" style="display:none">"base_in_cam_pose"</span><span data-if="dotnet" style="display:none">"base_in_cam_pose"</span><span data-if="python" style="display:none">"base_in_cam_pose"</span></i> is calculated accordingly.
It is necessary to determine the true translation in Z after the
calibration by moving the robot to a pose of
known height in the camera coordinate system. For this, the following
approach can be applied: A calibration plate (that is not attached to the
robot) is placed at an arbitrary position such that it can be observed by
the camera. The pose of the calibration plate must then be determined in
the camera coordinate system (<i>ObjInCamPose</i>). Afterwards the tool
of the robot is manually moved to the origin of the calibration plate
and the robot pose is queried (<i>ToolInBasePose</i>). The two
poses and the result of the calibration (<i>BaseInCamPose</i>) can be used
to fix the Z ambiguity by using the following lines of code:
</p>
<div style="text-align:center"><table style="width:90%;margin-left:auto;margin-right:auto" class="layout">
<col span="1" style="width:90%;">
<tr><td style="text-align:left">
<a href="pose_invert.html"><code><span data-if="hdevelop" style="display:inline">pose_invert(BaseInCamPose, CamInBasePose)</span><span data-if="c" style="display:none">pose_invert(BaseInCamPose, CamInBasePose)</span><span data-if="cpp" style="display:none">PoseInvert(BaseInCamPose, CamInBasePose)</span><span data-if="com" style="display:none">PoseInvert(BaseInCamPose, CamInBasePose)</span><span data-if="dotnet" style="display:none">PoseInvert(BaseInCamPose, CamInBasePose)</span><span data-if="python" style="display:none">pose_invert(BaseInCamPose, CamInBasePose)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="pose_compose.html"><code><span data-if="hdevelop" style="display:inline">pose_compose(CamInBasePose, ObjInCamPose, ObjInBasePose)</span><span data-if="c" style="display:none">pose_compose(CamInBasePose, ObjInCamPose, ObjInBasePose)</span><span data-if="cpp" style="display:none">PoseCompose(CamInBasePose, ObjInCamPose, ObjInBasePose)</span><span data-if="com" style="display:none">PoseCompose(CamInBasePose, ObjInCamPose, ObjInBasePose)</span><span data-if="dotnet" style="display:none">PoseCompose(CamInBasePose, ObjInCamPose, ObjInBasePose)</span><span data-if="python" style="display:none">pose_compose(CamInBasePose, ObjInCamPose, ObjInBasePose)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<code>ZCorrection := ObjInBasePose[2]-ToolInBasePose[2]</code>
</td></tr>
<tr><td style="text-align:left">
<a href="set_origin_pose.html"><code><span data-if="hdevelop" style="display:inline">set_origin_pose(BaseInCamPose, 0, 0, ZCorrection, BaseInCamPoseFinal)</span><span data-if="c" style="display:none">set_origin_pose(BaseInCamPose, 0, 0, ZCorrection, BaseInCamPoseFinal)</span><span data-if="cpp" style="display:none">SetOriginPose(BaseInCamPose, 0, 0, ZCorrection, BaseInCamPoseFinal)</span><span data-if="com" style="display:none">SetOriginPose(BaseInCamPose, 0, 0, ZCorrection, BaseInCamPoseFinal)</span><span data-if="dotnet" style="display:none">SetOriginPose(BaseInCamPose, 0, 0, ZCorrection, BaseInCamPoseFinal)</span><span data-if="python" style="display:none">set_origin_pose(BaseInCamPose, 0, 0, ZCorrection, BaseInCamPoseFinal)</span></code></a>
</td></tr>
</table></div>
<p>The <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i> also estimates the
uncertainty of observations. Besides the input poses described above,
it also uses the extracted calibration marks and is thus only available
for use with a camera and a calibration plate, not for use with a 3D sensor.
For articulated robots, the hand-eye poses and camera parameters are refined
simultaneously.
</p>
<h3>Preparing the calibration input data</h3>
<p>Before calling <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code>, you must create and fill the
calibration data model with the following steps:
</p>
<ol>
<li>
<p> <b>Create a calibration data model</b> with 该算子
<a href="create_calib_data.html"><code><span data-if="hdevelop" style="display:inline">create_calib_data</span><span data-if="c" style="display:none">create_calib_data</span><span data-if="cpp" style="display:none">CreateCalibData</span><span data-if="com" style="display:none">CreateCalibData</span><span data-if="dotnet" style="display:none">CreateCalibData</span><span data-if="python" style="display:none">create_calib_data</span></code></a>, specifying the number of cameras in the setup
and the number of used calibration objects. Depending on your scenario,
<code><span data-if="hdevelop" style="display:inline">CalibSetup</span><span data-if="c" style="display:none">CalibSetup</span><span data-if="cpp" style="display:none">CalibSetup</span><span data-if="com" style="display:none">CalibSetup</span><span data-if="dotnet" style="display:none">calibSetup</span><span data-if="python" style="display:none">calib_setup</span></code> has to be set to <i><span data-if="hdevelop" style="display:inline">'hand_eye_moving_camera'</span><span data-if="c" style="display:none">"hand_eye_moving_camera"</span><span data-if="cpp" style="display:none">"hand_eye_moving_camera"</span><span data-if="com" style="display:none">"hand_eye_moving_camera"</span><span data-if="dotnet" style="display:none">"hand_eye_moving_camera"</span><span data-if="python" style="display:none">"hand_eye_moving_camera"</span></i>,
<i><span data-if="hdevelop" style="display:inline">'hand_eye_stationary_camera'</span><span data-if="c" style="display:none">"hand_eye_stationary_camera"</span><span data-if="cpp" style="display:none">"hand_eye_stationary_camera"</span><span data-if="com" style="display:none">"hand_eye_stationary_camera"</span><span data-if="dotnet" style="display:none">"hand_eye_stationary_camera"</span><span data-if="python" style="display:none">"hand_eye_stationary_camera"</span></i>,
<i><span data-if="hdevelop" style="display:inline">'hand_eye_scara_moving_camera'</span><span data-if="c" style="display:none">"hand_eye_scara_moving_camera"</span><span data-if="cpp" style="display:none">"hand_eye_scara_moving_camera"</span><span data-if="com" style="display:none">"hand_eye_scara_moving_camera"</span><span data-if="dotnet" style="display:none">"hand_eye_scara_moving_camera"</span><span data-if="python" style="display:none">"hand_eye_scara_moving_camera"</span></i>, or
<i><span data-if="hdevelop" style="display:inline">'hand_eye_scara_stationary_camera'</span><span data-if="c" style="display:none">"hand_eye_scara_stationary_camera"</span><span data-if="cpp" style="display:none">"hand_eye_scara_stationary_camera"</span><span data-if="com" style="display:none">"hand_eye_scara_stationary_camera"</span><span data-if="dotnet" style="display:none">"hand_eye_scara_stationary_camera"</span><span data-if="python" style="display:none">"hand_eye_scara_stationary_camera"</span></i>. These four scenarios on the
one hand distinguish whether the camera or the calibration object is
moved by the robot and on the other hand distinguish whether an
articulated robot or a SCARA robot is calibrated. The arm of an
articulated robot has three rotary joints typically covering 6 degrees
of freedom (3 translations and 3 rotations). SCARA robots have two
parallel rotary joints and one parallel prismatic joint covering only
4 degrees of freedom (3 translations and 1 rotation). Loosely speaking,
an articulated robot is able to tilt its end effector while a SCARA robot
is not.
</p>
</li>
<li>
<p> <b>Specify the optimization method</b> with 该算子
<a href="set_calib_data.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data</span><span data-if="c" style="display:none">set_calib_data</span><span data-if="cpp" style="display:none">SetCalibData</span><span data-if="com" style="display:none">SetCalibData</span><span data-if="dotnet" style="display:none">SetCalibData</span><span data-if="python" style="display:none">set_calib_data</span></code></a>. For the parameter
<code><span data-if="hdevelop" style="display:inline">DataName</span><span data-if="c" style="display:none">DataName</span><span data-if="cpp" style="display:none">DataName</span><span data-if="com" style="display:none">DataName</span><span data-if="dotnet" style="display:none">dataName</span><span data-if="python" style="display:none">data_name</span></code>=<i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i>, three options for
<code><span data-if="hdevelop" style="display:inline">DataValue</span><span data-if="c" style="display:none">DataValue</span><span data-if="cpp" style="display:none">DataValue</span><span data-if="com" style="display:none">DataValue</span><span data-if="dotnet" style="display:none">dataValue</span><span data-if="python" style="display:none">data_value</span></code> are available, <code><span data-if="hdevelop" style="display:inline">DataValue</span><span data-if="c" style="display:none">DataValue</span><span data-if="cpp" style="display:none">DataValue</span><span data-if="com" style="display:none">DataValue</span><span data-if="dotnet" style="display:none">dataValue</span><span data-if="python" style="display:none">data_value</span></code>=<i><span data-if="hdevelop" style="display:inline">'linear'</span><span data-if="c" style="display:none">"linear"</span><span data-if="cpp" style="display:none">"linear"</span><span data-if="com" style="display:none">"linear"</span><span data-if="dotnet" style="display:none">"linear"</span><span data-if="python" style="display:none">"linear"</span></i>,
<code><span data-if="hdevelop" style="display:inline">DataValue</span><span data-if="c" style="display:none">DataValue</span><span data-if="cpp" style="display:none">DataValue</span><span data-if="com" style="display:none">DataValue</span><span data-if="dotnet" style="display:none">dataValue</span><span data-if="python" style="display:none">data_value</span></code>=<i><span data-if="hdevelop" style="display:inline">'nonlinear'</span><span data-if="c" style="display:none">"nonlinear"</span><span data-if="cpp" style="display:none">"nonlinear"</span><span data-if="com" style="display:none">"nonlinear"</span><span data-if="dotnet" style="display:none">"nonlinear"</span><span data-if="python" style="display:none">"nonlinear"</span></i>
and <code><span data-if="hdevelop" style="display:inline">DataValue</span><span data-if="c" style="display:none">DataValue</span><span data-if="cpp" style="display:none">DataValue</span><span data-if="com" style="display:none">DataValue</span><span data-if="dotnet" style="display:none">dataValue</span><span data-if="python" style="display:none">data_value</span></code>=<i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>
(see paragraph 'Performing the actual hand-eye calibration').
</p>
</li>
<li>
<p> <b>Specify the poses of the calibration object</b>
</p>
<ol>
<li>
<p> For each observation of the calibration object,
the 3D pose can be set directly using 该算子
<a href="set_calib_data_observ_pose.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data_observ_pose</span><span data-if="c" style="display:none">set_calib_data_observ_pose</span><span data-if="cpp" style="display:none">SetCalibDataObservPose</span><span data-if="com" style="display:none">SetCalibDataObservPose</span><span data-if="dotnet" style="display:none">SetCalibDataObservPose</span><span data-if="python" style="display:none">set_calib_data_observ_pose</span></code></a>. This operator is
intended to be used with generic 3D sensors that observe the
calibration object.
</p>
</li>
<li>
<p> The pose of the calibration object can also be estimated using
camera images. The calibration object has to be set in the
calibration data model <a href="#CalibDataID"><i><code><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></code></i></a> with 该算子
<a href="set_calib_data_calib_object.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data_calib_object</span><span data-if="c" style="display:none">set_calib_data_calib_object</span><span data-if="cpp" style="display:none">SetCalibDataCalibObject</span><span data-if="com" style="display:none">SetCalibDataCalibObject</span><span data-if="dotnet" style="display:none">SetCalibDataCalibObject</span><span data-if="python" style="display:none">set_calib_data_calib_object</span></code></a>. Initial camera parameters have
to be set with 该算子 <a href="set_calib_data_cam_param.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data_cam_param</span><span data-if="c" style="display:none">set_calib_data_cam_param</span><span data-if="cpp" style="display:none">SetCalibDataCamParam</span><span data-if="com" style="display:none">SetCalibDataCamParam</span><span data-if="dotnet" style="display:none">SetCalibDataCamParam</span><span data-if="python" style="display:none">set_calib_data_cam_param</span></code></a>.
If a standard HALCON calibration plate is used, 该算子
<a href="find_calib_object.html"><code><span data-if="hdevelop" style="display:inline">find_calib_object</span><span data-if="c" style="display:none">find_calib_object</span><span data-if="cpp" style="display:none">FindCalibObject</span><span data-if="com" style="display:none">FindCalibObject</span><span data-if="dotnet" style="display:none">FindCalibObject</span><span data-if="python" style="display:none">find_calib_object</span></code></a> determines the pose of the
calibration plate relative to the camera and saves it in the
calibration data model <a href="#CalibDataID"><i><code><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></code></i></a>.
</p>
<p>该算子 <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code> for articulated (i.e.,
non-SCARA) robots in this case calibrates the camera
before performing the hand-eye calibration.
If <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> is set to <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>,
the hand-eye poses and camera parameters are then refined simultaneously.
If the provided
camera parameters are already calibrated, the camera calibration
can be switched off by calling
<a href="set_calib_data.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data(CalibDataID,'camera','general','excluded_settings','params')</span><span data-if="c" style="display:none">set_calib_data(CalibDataID,"camera","general","excluded_settings","params")</span><span data-if="cpp" style="display:none">SetCalibData(CalibDataID,"camera","general","excluded_settings","params")</span><span data-if="com" style="display:none">SetCalibData(CalibDataID,"camera","general","excluded_settings","params")</span><span data-if="dotnet" style="display:none">SetCalibData(CalibDataID,"camera","general","excluded_settings","params")</span><span data-if="python" style="display:none">set_calib_data(CalibDataID,"camera","general","excluded_settings","params")</span></code></a>.
</p>
<p>In contrast, for SCARA robots <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code> always
assumes that the provided camera parameters are already calibrated.
Therefore, in this case the internal camera calibration
is never performed automatically during hand-eye calibration.
This is because the internal camera parameters cannot
be calibrated reliably without significantly tilting the calibration
plate with respect to the camera. For hand-eye calibration,
the calibration plate is often approximately parallel to the
image plane. Therefore, for SCARA robots all camera poses are
approximately parallel. Therefore, the camera must be calibrated
beforehand by using a different set of calibration images.
</p>
</li>
</ol>

</li>
<li>
<p> <b>Specify the poses of the tool</b> in robot base coordinates.
For each pose of the calibration object in the camera coordinate system, the
corresponding pose of the tool in the robot base coordinate system has to be
set with 该算子
<a href="set_calib_data.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data(CalibDataID,'tool', PoseNumber, 'tool_in_base_pose', ToolInBasePose)</span><span data-if="c" style="display:none">set_calib_data(CalibDataID,"tool", PoseNumber, "tool_in_base_pose", ToolInBasePose)</span><span data-if="cpp" style="display:none">SetCalibData(CalibDataID,"tool", PoseNumber, "tool_in_base_pose", ToolInBasePose)</span><span data-if="com" style="display:none">SetCalibData(CalibDataID,"tool", PoseNumber, "tool_in_base_pose", ToolInBasePose)</span><span data-if="dotnet" style="display:none">SetCalibData(CalibDataID,"tool", PoseNumber, "tool_in_base_pose", ToolInBasePose)</span><span data-if="python" style="display:none">set_calib_data(CalibDataID,"tool", PoseNumber, "tool_in_base_pose", ToolInBasePose)</span></code></a>.
</p>
</li>
</ol>
<h3>Performing the actual hand-eye calibration</h3>
<p>该算子 <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code> can perform the calibration in three
different ways. In all cases, all provided calibration object poses in
camera coordinates and the corresponding poses of the tool in robot base
coordinates are used for the calibration. The method <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>
also uses the extracted calibration marks, and is thus only available for
use with a camera and a calibration plate, not for use with a 3D sensor.
The method to be used is specified with <a href="set_calib_data.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data</span><span data-if="c" style="display:none">set_calib_data</span><span data-if="cpp" style="display:none">SetCalibData</span><span data-if="com" style="display:none">SetCalibData</span><span data-if="dotnet" style="display:none">SetCalibData</span><span data-if="python" style="display:none">set_calib_data</span></code></a>.
</p>
<p>For the parameter combination
<code><span data-if="hdevelop" style="display:inline">DataName</span><span data-if="c" style="display:none">DataName</span><span data-if="cpp" style="display:none">DataName</span><span data-if="com" style="display:none">DataName</span><span data-if="dotnet" style="display:none">dataName</span><span data-if="python" style="display:none">data_name</span></code>=<i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> and
<code><span data-if="hdevelop" style="display:inline">DataValue</span><span data-if="c" style="display:none">DataValue</span><span data-if="cpp" style="display:none">DataValue</span><span data-if="com" style="display:none">DataValue</span><span data-if="dotnet" style="display:none">dataValue</span><span data-if="python" style="display:none">data_value</span></code>=<i><span data-if="hdevelop" style="display:inline">'linear'</span><span data-if="c" style="display:none">"linear"</span><span data-if="cpp" style="display:none">"linear"</span><span data-if="com" style="display:none">"linear"</span><span data-if="dotnet" style="display:none">"linear"</span><span data-if="python" style="display:none">"linear"</span></i>, the calibration is performed using a
linear algorithm which is fast but in many practical situations not accurate
enough.
</p>
<p>For the parameter
<code><span data-if="hdevelop" style="display:inline">DataName</span><span data-if="c" style="display:none">DataName</span><span data-if="cpp" style="display:none">DataName</span><span data-if="com" style="display:none">DataName</span><span data-if="dotnet" style="display:none">dataName</span><span data-if="python" style="display:none">data_name</span></code>=<i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> and
<code><span data-if="hdevelop" style="display:inline">DataValue</span><span data-if="c" style="display:none">DataValue</span><span data-if="cpp" style="display:none">DataValue</span><span data-if="com" style="display:none">DataValue</span><span data-if="dotnet" style="display:none">dataValue</span><span data-if="python" style="display:none">data_value</span></code>=<i><span data-if="hdevelop" style="display:inline">'nonlinear'</span><span data-if="c" style="display:none">"nonlinear"</span><span data-if="cpp" style="display:none">"nonlinear"</span><span data-if="com" style="display:none">"nonlinear"</span><span data-if="dotnet" style="display:none">"nonlinear"</span><span data-if="python" style="display:none">"nonlinear"</span></i>, the calibration is performed using
a non-linear algorithm, which results in more accurately calibrated poses.
</p>
<p>For the parameter
<code><span data-if="hdevelop" style="display:inline">DataName</span><span data-if="c" style="display:none">DataName</span><span data-if="cpp" style="display:none">DataName</span><span data-if="com" style="display:none">DataName</span><span data-if="dotnet" style="display:none">dataName</span><span data-if="python" style="display:none">data_name</span></code>=<i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> and
<code><span data-if="hdevelop" style="display:inline">DataValue</span><span data-if="c" style="display:none">DataValue</span><span data-if="cpp" style="display:none">DataValue</span><span data-if="com" style="display:none">DataValue</span><span data-if="dotnet" style="display:none">dataValue</span><span data-if="python" style="display:none">data_value</span></code>=<i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>, the calibration algorithm
models the uncertainty of all measured observations including the input robot
poses, which results in more robustly calibrated hand-eye poses. The estimation
will be better the more input poses are used. However, the method
is only available for use with a camera and a calibration plate, not for use
with a 3D sensor. For articulated robots, the hand-eye poses and camera
parameters are refined simultaneously.
</p>
<h3>Checking the success of the calibration</h3>
<p>
该算子 <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code> returns the pose error of the
complete chain of transformations in <a href="#Errors"><i><code><span data-if="hdevelop" style="display:inline">Errors</span><span data-if="c" style="display:none">Errors</span><span data-if="cpp" style="display:none">Errors</span><span data-if="com" style="display:none">Errors</span><span data-if="dotnet" style="display:none">errors</span><span data-if="python" style="display:none">errors</span></code></i></a>.
To be more precise, a tuple with four elements is returned, where the first
element is the root-mean-square error of the translational part, the second
element is the root-mean-square error of the rotational part, the third element
is the maximum translational error and the fourth element is the maximum
rotational error.  Using these error measures, it can be determined,
whether the calibration was successful.
</p>
<p>The <a href="#Errors"><i><code><span data-if="hdevelop" style="display:inline">Errors</span><span data-if="c" style="display:none">Errors</span><span data-if="cpp" style="display:none">Errors</span><span data-if="com" style="display:none">Errors</span><span data-if="dotnet" style="display:none">errors</span><span data-if="python" style="display:none">errors</span></code></i></a> are returned in the same units in which the input
poses were given, i.e., the translational errors are typically given
in meters and the rotational errors are always given in degrees.
</p>
<p>If <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> is set to <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>,
<a href="get_calib_data.html"><code><span data-if="hdevelop" style="display:inline">get_calib_data</span><span data-if="c" style="display:none">get_calib_data</span><span data-if="cpp" style="display:none">GetCalibData</span><span data-if="com" style="display:none">GetCalibData</span><span data-if="dotnet" style="display:none">GetCalibData</span><span data-if="python" style="display:none">get_calib_data</span></code></a> can be used to obtain
<i><span data-if="hdevelop" style="display:inline">'hand_eye_calib_error_corrected_tool'</span><span data-if="c" style="display:none">"hand_eye_calib_error_corrected_tool"</span><span data-if="cpp" style="display:none">"hand_eye_calib_error_corrected_tool"</span><span data-if="com" style="display:none">"hand_eye_calib_error_corrected_tool"</span><span data-if="dotnet" style="display:none">"hand_eye_calib_error_corrected_tool"</span><span data-if="python" style="display:none">"hand_eye_calib_error_corrected_tool"</span></i>, which differs from
<a href="#Errors"><i><code><span data-if="hdevelop" style="display:inline">Errors</span><span data-if="c" style="display:none">Errors</span><span data-if="cpp" style="display:none">Errors</span><span data-if="com" style="display:none">Errors</span><span data-if="dotnet" style="display:none">errors</span><span data-if="python" style="display:none">errors</span></code></i></a> only in that it uses the corrected robot tool poses instead
of the input robot tool poses.
</p>
<p>For articulated robots, <a href="get_calib_data.html"><code><span data-if="hdevelop" style="display:inline">get_calib_data</span><span data-if="c" style="display:none">get_calib_data</span><span data-if="cpp" style="display:none">GetCalibData</span><span data-if="com" style="display:none">GetCalibData</span><span data-if="dotnet" style="display:none">GetCalibData</span><span data-if="python" style="display:none">get_calib_data</span></code></a> can be used to obtain
the <i><span data-if="hdevelop" style="display:inline">'camera_calib_error'</span><span data-if="c" style="display:none">"camera_calib_error"</span><span data-if="cpp" style="display:none">"camera_calib_error"</span><span data-if="com" style="display:none">"camera_calib_error"</span><span data-if="dotnet" style="display:none">"camera_calib_error"</span><span data-if="python" style="display:none">"camera_calib_error"</span></i> of the camera calibration,
the root mean square error (RMSE) of the direct back projection of
calibration mark centers into camera images.
If <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> is set to <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>,
<i><span data-if="hdevelop" style="display:inline">'camera_calib_error_corrected_tool'</span><span data-if="c" style="display:none">"camera_calib_error_corrected_tool"</span><span data-if="cpp" style="display:none">"camera_calib_error_corrected_tool"</span><span data-if="com" style="display:none">"camera_calib_error_corrected_tool"</span><span data-if="dotnet" style="display:none">"camera_calib_error_corrected_tool"</span><span data-if="python" style="display:none">"camera_calib_error_corrected_tool"</span></i> returns the back
projection error via the pose chain using corrected tool poses.
</p>
<h3>Getting the calibration results</h3>
<p>The poses that are computed with 该算子 <code><span data-if="hdevelop" style="display:inline">calibrate_hand_eye</span><span data-if="c" style="display:none">calibrate_hand_eye</span><span data-if="cpp" style="display:none">CalibrateHandEye</span><span data-if="com" style="display:none">CalibrateHandEye</span><span data-if="dotnet" style="display:none">CalibrateHandEye</span><span data-if="python" style="display:none">calibrate_hand_eye</span></code>
can be queried with <a href="get_calib_data.html"><code><span data-if="hdevelop" style="display:inline">get_calib_data</span><span data-if="c" style="display:none">get_calib_data</span><span data-if="cpp" style="display:none">GetCalibData</span><span data-if="com" style="display:none">GetCalibData</span><span data-if="dotnet" style="display:none">GetCalibData</span><span data-if="python" style="display:none">get_calib_data</span></code></a>.
For the moving camera scenario, the 3D pose of the tool in the camera
coordinate system (<i><span data-if="hdevelop" style="display:inline">'tool_in_cam_pose'</span><span data-if="c" style="display:none">"tool_in_cam_pose"</span><span data-if="cpp" style="display:none">"tool_in_cam_pose"</span><span data-if="com" style="display:none">"tool_in_cam_pose"</span><span data-if="dotnet" style="display:none">"tool_in_cam_pose"</span><span data-if="python" style="display:none">"tool_in_cam_pose"</span></i>) and the 3D pose of the
calibration object in the robot base coordinate system
(<i><span data-if="hdevelop" style="display:inline">'obj_in_base_pose'</span><span data-if="c" style="display:none">"obj_in_base_pose"</span><span data-if="cpp" style="display:none">"obj_in_base_pose"</span><span data-if="com" style="display:none">"obj_in_base_pose"</span><span data-if="dotnet" style="display:none">"obj_in_base_pose"</span><span data-if="python" style="display:none">"obj_in_base_pose"</span></i>) can be obtained. For the stationary camera
scenario, the 3D pose of the robot base in the camera coordinate system
(<i><span data-if="hdevelop" style="display:inline">'base_in_cam_pose'</span><span data-if="c" style="display:none">"base_in_cam_pose"</span><span data-if="cpp" style="display:none">"base_in_cam_pose"</span><span data-if="com" style="display:none">"base_in_cam_pose"</span><span data-if="dotnet" style="display:none">"base_in_cam_pose"</span><span data-if="python" style="display:none">"base_in_cam_pose"</span></i>) and the 3D pose of the calibration object
in the coordinate system of the tool (<i><span data-if="hdevelop" style="display:inline">'obj_in_tool_pose'</span><span data-if="c" style="display:none">"obj_in_tool_pose"</span><span data-if="cpp" style="display:none">"obj_in_tool_pose"</span><span data-if="com" style="display:none">"obj_in_tool_pose"</span><span data-if="dotnet" style="display:none">"obj_in_tool_pose"</span><span data-if="python" style="display:none">"obj_in_tool_pose"</span></i>) can
be obtained.
</p>
<h3>Querying the input data</h3>
<p>If the poses of the calibration object relative to a camera were computed
with <a href="find_calib_object.html"><code><span data-if="hdevelop" style="display:inline">find_calib_object</span><span data-if="c" style="display:none">find_calib_object</span><span data-if="cpp" style="display:none">FindCalibObject</span><span data-if="com" style="display:none">FindCalibObject</span><span data-if="dotnet" style="display:none">FindCalibObject</span><span data-if="python" style="display:none">find_calib_object</span></code></a>, then for articulated (i.e., non-SCARA) robots
they are used in an internal camera
calibration step preceding the hand-eye calibration and are calibrated
as well. For <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> set to <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>,
the hand-eye poses and camera parameters are refined simultaneously,
the poses of the calibration object are then updated relative to the
resulting new camera parameters.
The calibrated 3D poses can be queried using <a href="get_calib_data.html"><code><span data-if="hdevelop" style="display:inline">get_calib_data</span><span data-if="c" style="display:none">get_calib_data</span><span data-if="cpp" style="display:none">GetCalibData</span><span data-if="com" style="display:none">GetCalibData</span><span data-if="dotnet" style="display:none">GetCalibData</span><span data-if="python" style="display:none">get_calib_data</span></code></a>
with the parameter <code><span data-if="hdevelop" style="display:inline">ItemType</span><span data-if="c" style="display:none">ItemType</span><span data-if="cpp" style="display:none">ItemType</span><span data-if="com" style="display:none">ItemType</span><span data-if="dotnet" style="display:none">itemType</span><span data-if="python" style="display:none">item_type</span></code>=<i><span data-if="hdevelop" style="display:inline">'calib_obj_pose'</span><span data-if="c" style="display:none">"calib_obj_pose"</span><span data-if="cpp" style="display:none">"calib_obj_pose"</span><span data-if="com" style="display:none">"calib_obj_pose"</span><span data-if="dotnet" style="display:none">"calib_obj_pose"</span><span data-if="python" style="display:none">"calib_obj_pose"</span></i>.
</p>
<p>If the poses
of the calibration object were observed with a generic 3D sensor, they cannot
be calibrated and are set by <a href="set_calib_data_observ_pose.html"><code><span data-if="hdevelop" style="display:inline">set_calib_data_observ_pose</span><span data-if="c" style="display:none">set_calib_data_observ_pose</span><span data-if="cpp" style="display:none">SetCalibDataObservPose</span><span data-if="com" style="display:none">SetCalibDataObservPose</span><span data-if="dotnet" style="display:none">SetCalibDataObservPose</span><span data-if="python" style="display:none">set_calib_data_observ_pose</span></code></a>. These raw
3D poses can be queried using <a href="get_calib_data_observ_pose.html"><code><span data-if="hdevelop" style="display:inline">get_calib_data_observ_pose</span><span data-if="c" style="display:none">get_calib_data_observ_pose</span><span data-if="cpp" style="display:none">GetCalibDataObservPose</span><span data-if="com" style="display:none">GetCalibDataObservPose</span><span data-if="dotnet" style="display:none">GetCalibDataObservPose</span><span data-if="python" style="display:none">get_calib_data_observ_pose</span></code></a>.
</p>
<p>The corresponding 3D poses of the tool in the coordinate system of the robot
base can be queried using <a href="get_calib_data.html"><code><span data-if="hdevelop" style="display:inline">get_calib_data</span><span data-if="c" style="display:none">get_calib_data</span><span data-if="cpp" style="display:none">GetCalibData</span><span data-if="com" style="display:none">GetCalibData</span><span data-if="dotnet" style="display:none">GetCalibData</span><span data-if="python" style="display:none">get_calib_data</span></code></a>.
</p>
<h3>Acquiring a suitable set of observations</h3>
<p>The following conditions, especially if using a standard calibration plate,
should be considered:
</p>
<ul>
<li>
<p>
The position of the calibration object (moving camera: relative to the
robot's base; stationary camera: relative to the robot's tool) and
the position of the camera (moving camera: relative to the
robot's tool; stationary camera: relative to the robot's base)
must not be changed between the calibration poses.
</p>
</li>
<li>
<p>
Even though a lower limit of three calibration object poses is
theoretically possible, it is recommended to acquire 10 or
more poses, in which the pose of the camera or the
robot hand are sufficiently different. If <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i>
is set to <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>, at least 25 poses
are recommended. The estimation will be better the more poses are used.
</p>
<p>For articulated (i.e., non-SCARA) robots the amount of rotation between
the calibration object poses is essential and should be at least 30
degrees or better 60 degrees.
The rotations between the poses must exhibit at least two different
axes of rotation. Very different orientations lead to more precise
results of the hand-eye calibration. For SCARA robots there is only one
axis of rotation. The amount of rotation between the images should also
be large.
</p>
</li>
<li>
<p>
For cameras, the internal camera parameters
must be constant during and after the calibration.
Note that changes of the image size, the focal length, the aperture,
or the focus cause a change of the internal camera parameters.
</p>
</li>
<li>
<p>
As mentioned, the camera must not be modified between the acquisition
of the individual images. Please make sure that the focus is sufficient
for the expected changes of the camera to calibration plate distance.
Therefore, bright lighting conditions for the calibration plate are
important, because then you can use smaller apertures, which result in
a larger depth of focus.
</p>
</li>
</ul>
<h3>Obtaining the poses of the robot tool</h3>
<p>We recommend to create the robot poses in a separate program and save them
in files using <a href="write_pose.html"><code><span data-if="hdevelop" style="display:inline">write_pose</span><span data-if="c" style="display:none">write_pose</span><span data-if="cpp" style="display:none">WritePose</span><span data-if="com" style="display:none">WritePose</span><span data-if="dotnet" style="display:none">WritePose</span><span data-if="python" style="display:none">write_pose</span></code></a>. In the calibration program you can then
import them and set them in the calibration data model <a href="#CalibDataID"><i><code><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></code></i></a>.
</p>
<p>Via the Cartesian interface of the robot, you can typically obtain the pose
of the tool in robot base coordinates in a notation that corresponds to the
pose representations with the codes 0 or 2 (<code><span data-if="hdevelop" style="display:inline">OrderOfRotation</span><span data-if="c" style="display:none">OrderOfRotation</span><span data-if="cpp" style="display:none">OrderOfRotation</span><span data-if="com" style="display:none">OrderOfRotation</span><span data-if="dotnet" style="display:none">orderOfRotation</span><span data-if="python" style="display:none">order_of_rotation</span></code> =
<i><span data-if="hdevelop" style="display:inline">'gba'</span><span data-if="c" style="display:none">"gba"</span><span data-if="cpp" style="display:none">"gba"</span><span data-if="com" style="display:none">"gba"</span><span data-if="dotnet" style="display:none">"gba"</span><span data-if="python" style="display:none">"gba"</span></i> or <i><span data-if="hdevelop" style="display:inline">'abg'</span><span data-if="c" style="display:none">"abg"</span><span data-if="cpp" style="display:none">"abg"</span><span data-if="com" style="display:none">"abg"</span><span data-if="dotnet" style="display:none">"abg"</span><span data-if="python" style="display:none">"abg"</span></i>, see <a href="create_pose.html"><code><span data-if="hdevelop" style="display:inline">create_pose</span><span data-if="c" style="display:none">create_pose</span><span data-if="cpp" style="display:none">CreatePose</span><span data-if="com" style="display:none">CreatePose</span><span data-if="dotnet" style="display:none">CreatePose</span><span data-if="python" style="display:none">create_pose</span></code></a>). In this case,
you can directly use the pose values obtained from the robot as input for
<a href="create_pose.html"><code><span data-if="hdevelop" style="display:inline">create_pose</span><span data-if="c" style="display:none">create_pose</span><span data-if="cpp" style="display:none">CreatePose</span><span data-if="com" style="display:none">CreatePose</span><span data-if="dotnet" style="display:none">CreatePose</span><span data-if="python" style="display:none">create_pose</span></code></a>.
</p>
<p>If the Cartesian interface of your robot describes the orientation in a
different way, e.g., with the representation ZYZ (<span title="8" style="vertical-align:-0.363664em" class="math"><!-- Created by MetaPost 1.902 on 2023.05.15:2033 --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="11.3141em" height="1.15724em" viewBox="0 0 181.024857 18.515915">
<!-- Original BoundingBox: -90.512436 -9.257965 90.512421 9.257950 -->
  <defs>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_121">
      <path style="fill-rule: evenodd;" d="M556.000000 -377.000000C560.000000 -391.000000,560.000000 -393.000000,560.000000 -399.000000C560.000000 -419.000000,544.000000 -431.000000,527.000000 -431.000000C516.000000 -431.000000,497.000000 -426.000000,486.000000 -407.000000C483.000000 -401.000000,475.000000 -369.000000,470.000000 -349.000000L449.000000 -266.000000C443.000000 -242.000000,412.000000 -116.000000,409.000000 -105.000000C408.000000 -105.000000,364.000000 -18.000000,286.000000 -18.000000C218.000000 -18.000000,218.000000 -83.000000,218.000000 -101.000000C218.000000 -155.000000,241.000000 -218.000000,271.000000 -295.000000C283.000000 -327.000000,288.000000 -339.000000,288.000000 -356.000000C288.000000 -404.000000,247.000000 -441.000000,193.000000 -441.000000C92.000000 -441.000000,47.000000 -305.000000,47.000000 -288.000000C47.000000 -275.000000,61.000000 -275.000000,64.000000 -275.000000C78.000000 -275.000000,79.000000 -280.000000,82.000000 -291.000000C107.000000 -374.000000,150.000000 -413.000000,190.000000 -413.000000C207.000000 -413.000000,215.000000 -402.000000,215.000000 -378.000000C215.000000 -355.000000,206.000000 -333.000000,201.000000 -320.000000C153.000000 -198.000000,143.000000 -161.000000,143.000000 -117.000000C143.000000 -100.000000,143.000000 -53.000000,182.000000 -21.000000C213.000000 5.000000,255.000000 10.000000,282.000000 10.000000C322.000000 10.000000,358.000000 -5.000000,391.000000 -35.000000C378.000000 20.000000,367.000000 62.000000,325.000000 112.000000C298.000000 143.000000,258.000000 176.000000,205.000000 176.000000C198.000000 176.000000,151.000000 176.000000,130.000000 143.000000C184.000000 137.000000,184.000000 89.000000,184.000000 88.000000C184.000000 56.000000,155.000000 50.000000,145.000000 50.000000C120.000000 50.000000,87.000000 70.000000,87.000000 116.000000C87.000000 167.000000,135.000000 204.000000,206.000000 204.000000C307.000000 204.000000,430.000000 126.000000,461.000000 1.000000"></path>
    </g>
    <g transform="scale(0.006974,0.006974)" id="GLYPHcmmi7_122">
      <path style="fill-rule: evenodd;" d="M168.000000 -88.000000C194.000000 -114.000000,212.000000 -133.000000,297.000000 -201.000000C318.000000 -218.000000,393.000000 -278.000000,422.000000 -306.000000C483.000000 -366.000000,521.000000 -417.000000,521.000000 -429.000000C521.000000 -441.000000,508.000000 -441.000000,504.000000 -441.000000C495.000000 -441.000000,492.000000 -439.000000,487.000000 -431.000000C456.000000 -385.000000,435.000000 -370.000000,411.000000 -370.000000C399.000000 -370.000000,384.000000 -371.000000,354.000000 -400.000000C320.000000 -434.000000,298.000000 -441.000000,275.000000 -441.000000C195.000000 -441.000000,141.000000 -354.000000,141.000000 -324.000000C141.000000 -315.000000,151.000000 -312.000000,158.000000 -312.000000C170.000000 -312.000000,172.000000 -315.000000,176.000000 -326.000000C191.000000 -361.000000,247.000000 -363.000000,263.000000 -363.000000C286.000000 -363.000000,312.000000 -357.000000,326.000000 -354.000000C381.000000 -342.000000,388.000000 -342.000000,413.000000 -342.000000C387.000000 -315.000000,369.000000 -297.000000,274.000000 -221.000000C196.000000 -159.000000,169.000000 -134.000000,150.000000 -114.000000C90.000000 -55.000000,61.000000 -11.000000,61.000000 -2.000000C61.000000 10.000000,74.000000 10.000000,78.000000 10.000000C88.000000 10.000000,90.000000 8.000000,95.000000 -0.000000C122.000000 -38.000000,153.000000 -61.000000,187.000000 -61.000000C199.000000 -61.000000,214.000000 -60.000000,241.000000 -35.000000C272.000000 -5.000000,292.000000 10.000000,324.000000 10.000000C431.000000 10.000000,498.000000 -111.000000,498.000000 -145.000000C498.000000 -157.000000,487.000000 -158.000000,481.000000 -158.000000C469.000000 -158.000000,467.000000 -153.000000,463.000000 -142.000000C444.000000 -92.000000,385.000000 -68.000000,336.000000 -68.000000C313.000000 -68.000000,288.000000 -73.000000,263.000000 -79.000000C217.000000 -89.000000,209.000000 -89.000000,191.000000 -89.000000C189.000000 -89.000000,174.000000 -89.000000,168.000000 -88.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_40">
      <path style="fill-rule: evenodd;" d="M331.000000 240.000000C331.000000 237.000000,331.000000 235.000000,314.000000 218.000000C189.000000 92.000000,157.000000 -97.000000,157.000000 -250.000000C157.000000 -424.000000,195.000000 -598.000000,318.000000 -723.000000C331.000000 -735.000000,331.000000 -737.000000,331.000000 -740.000000C331.000000 -747.000000,327.000000 -750.000000,321.000000 -750.000000C311.000000 -750.000000,221.000000 -682.000000,162.000000 -555.000000C111.000000 -445.000000,99.000000 -334.000000,99.000000 -250.000000C99.000000 -172.000000,110.000000 -51.000000,165.000000 62.000000C225.000000 185.000000,311.000000 250.000000,321.000000 250.000000C327.000000 250.000000,331.000000 247.000000,331.000000 240.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_41">
      <path style="fill-rule: evenodd;" d="M289.000000 -250.000000C289.000000 -328.000000,278.000000 -449.000000,223.000000 -562.000000C163.000000 -685.000000,77.000000 -750.000000,67.000000 -750.000000C61.000000 -750.000000,57.000000 -746.000000,57.000000 -740.000000C57.000000 -737.000000,57.000000 -735.000000,76.000000 -717.000000C174.000000 -618.000000,231.000000 -459.000000,231.000000 -250.000000C231.000000 -79.000000,194.000000 97.000000,70.000000 223.000000C57.000000 235.000000,57.000000 237.000000,57.000000 240.000000C57.000000 246.000000,61.000000 250.000000,67.000000 250.000000C77.000000 250.000000,167.000000 182.000000,226.000000 55.000000C277.000000 -55.000000,289.000000 -166.000000,289.000000 -250.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_49">
      <path style="fill-rule: evenodd;" d="M294.000000 -640.000000C294.000000 -664.000000,294.000000 -666.000000,271.000000 -666.000000C209.000000 -602.000000,121.000000 -602.000000,89.000000 -602.000000L89.000000 -571.000000C109.000000 -571.000000,168.000000 -571.000000,220.000000 -597.000000L220.000000 -79.000000C220.000000 -43.000000,217.000000 -31.000000,127.000000 -31.000000L95.000000 -31.000000L95.000000 -0.000000L257.000000 -0.000000L130.000000 -3.000000L217.000000 -3.000000L257.000000 -3.000000L297.000000 -3.000000L384.000000 -3.000000L419.000000 -0.000000L419.000000 -31.000000L387.000000 -31.000000C297.000000 -31.000000,294.000000 -42.000000,294.000000 -79.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_50">
      <path style="fill-rule: evenodd;" d="M127.000000 -77.000000L233.000000 -180.000000C389.000000 -318.000000,449.000000 -372.000000,449.000000 -472.000000C449.000000 -586.000000,359.000000 -666.000000,237.000000 -666.000000C124.000000 -666.000000,50.000000 -574.000000,50.000000 -485.000000C50.000000 -429.000000,100.000000 -429.000000,103.000000 -429.000000C120.000000 -429.000000,155.000000 -441.000000,155.000000 -482.000000C155.000000 -508.000000,137.000000 -534.000000,102.000000 -534.000000C94.000000 -534.000000,92.000000 -534.000000,89.000000 -533.000000C112.000000 -598.000000,166.000000 -635.000000,224.000000 -635.000000C315.000000 -635.000000,358.000000 -554.000000,358.000000 -472.000000C358.000000 -392.000000,308.000000 -313.000000,253.000000 -251.000000L61.000000 -37.000000C50.000000 -26.000000,50.000000 -24.000000,50.000000 -0.000000L421.000000 -0.000000L449.000000 -174.000000L424.000000 -174.000000C419.000000 -144.000000,412.000000 -100.000000,402.000000 -85.000000C395.000000 -77.000000,329.000000 -77.000000,307.000000 -77.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmr10_51">
      <path style="fill-rule: evenodd;" d="M290.000000 -352.000000C372.000000 -379.000000,430.000000 -449.000000,430.000000 -528.000000C430.000000 -610.000000,342.000000 -666.000000,246.000000 -666.000000C145.000000 -666.000000,69.000000 -606.000000,69.000000 -530.000000C69.000000 -497.000000,91.000000 -478.000000,120.000000 -478.000000C151.000000 -478.000000,171.000000 -500.000000,171.000000 -529.000000C171.000000 -579.000000,124.000000 -579.000000,109.000000 -579.000000C140.000000 -628.000000,206.000000 -641.000000,242.000000 -641.000000C283.000000 -641.000000,338.000000 -619.000000,338.000000 -529.000000C338.000000 -517.000000,336.000000 -459.000000,310.000000 -415.000000C280.000000 -367.000000,246.000000 -364.000000,221.000000 -363.000000C213.000000 -362.000000,189.000000 -360.000000,182.000000 -360.000000C174.000000 -359.000000,167.000000 -358.000000,167.000000 -348.000000C167.000000 -337.000000,174.000000 -337.000000,191.000000 -337.000000L235.000000 -337.000000C317.000000 -337.000000,354.000000 -269.000000,354.000000 -171.000000C354.000000 -35.000000,285.000000 -6.000000,241.000000 -6.000000C198.000000 -6.000000,123.000000 -23.000000,88.000000 -82.000000C123.000000 -77.000000,154.000000 -99.000000,154.000000 -137.000000C154.000000 -173.000000,127.000000 -193.000000,98.000000 -193.000000C74.000000 -193.000000,42.000000 -179.000000,42.000000 -135.000000C42.000000 -44.000000,135.000000 22.000000,244.000000 22.000000C366.000000 22.000000,457.000000 -69.000000,457.000000 -171.000000C457.000000 -253.000000,394.000000 -331.000000,290.000000 -352.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmsy10_1">
      <path style="fill-rule: evenodd;" d="M192.000000 -250.000000C192.000000 -279.000000,168.000000 -303.000000,139.000000 -303.000000C110.000000 -303.000000,86.000000 -279.000000,86.000000 -250.000000C86.000000 -221.000000,110.000000 -197.000000,139.000000 -197.000000C168.000000 -197.000000,192.000000 -221.000000,192.000000 -250.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmmi10_39">
      <path style="fill-rule: evenodd;" d="M170.000000 170.000000C166.000000 183.000000,165.000000 185.000000,165.000000 190.000000C165.000000 212.000000,184.000000 218.000000,194.000000 218.000000C199.000000 218.000000,221.000000 215.000000,231.000000 192.000000C234.000000 184.000000,239.000000 151.000000,266.000000 9.000000C275.000000 10.000000,282.000000 11.000000,299.000000 11.000000C465.000000 11.000000,619.000000 -146.000000,619.000000 -304.000000C619.000000 -382.000000,580.000000 -442.000000,505.000000 -442.000000C360.000000 -442.000000,300.000000 -248.000000,240.000000 -53.000000C132.000000 -73.000000,76.000000 -129.000000,76.000000 -201.000000C76.000000 -229.000000,99.000000 -339.000000,159.000000 -408.000000C167.000000 -417.000000,167.000000 -419.000000,167.000000 -421.000000C167.000000 -425.000000,165.000000 -431.000000,155.000000 -431.000000C127.000000 -431.000000,50.000000 -286.000000,50.000000 -190.000000C50.000000 -96.000000,116.000000 -23.000000,223.000000 2.000000M308.000000 -47.000000C300.000000 -47.000000,298.000000 -47.000000,290.000000 -48.000000C278.000000 -48.000000,277.000000 -49.000000,277.000000 -52.000000C277.000000 -54.000000,294.000000 -145.000000,297.000000 -160.000000C328.000000 -288.000000,406.000000 -384.000000,495.000000 -384.000000C564.000000 -384.000000,591.000000 -330.000000,591.000000 -282.000000C591.000000 -169.000000,462.000000 -47.000000,308.000000 -47.000000"></path>
    </g>
    <g transform="scale(0.009963,0.009963)" id="GLYPHcmbx10_82">
      <path style="fill-rule: evenodd;" d="M283.000000 -361.000000L283.000000 -639.000000L401.000000 -639.000000C562.000000 -639.000000,564.000000 -561.000000,564.000000 -500.000000C564.000000 -444.000000,564.000000 -361.000000,399.000000 -361.000000M550.000000 -340.000000C666.000000 -370.000000,717.000000 -435.000000,717.000000 -501.000000C717.000000 -602.000000,607.000000 -686.000000,419.000000 -686.000000L39.000000 -686.000000L39.000000 -639.000000L147.000000 -639.000000L147.000000 -47.000000L39.000000 -47.000000L39.000000 -0.000000L215.000000 -0.000000L75.000000 -3.000000L173.000000 -3.000000L215.000000 -3.000000L257.000000 -3.000000L355.000000 -3.000000L391.000000 -0.000000L391.000000 -47.000000L283.000000 -47.000000L283.000000 -325.000000L400.000000 -325.000000C414.000000 -325.000000,458.000000 -325.000000,489.000000 -291.000000C521.000000 -256.000000,521.000000 -237.000000,521.000000 -164.000000C521.000000 -98.000000,521.000000 -49.000000,591.000000 -15.000000C635.000000 7.000000,697.000000 11.000000,738.000000 11.000000C845.000000 11.000000,858.000000 -79.000000,858.000000 -95.000000C858.000000 -117.000000,844.000000 -117.000000,834.000000 -117.000000C813.000000 -117.000000,812.000000 -107.000000,811.000000 -94.000000C806.000000 -47.000000,777.000000 -25.000000,747.000000 -25.000000C687.000000 -25.000000,678.000000 -96.000000,673.000000 -138.000000C671.000000 -149.000000,663.000000 -218.000000,662.000000 -223.000000C648.000000 -293.000000,593.000000 -324.000000,550.000000 -340.000000"></path>
    </g>
  </defs>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,0.503555 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_82"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,14.251953 15.088348)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_122"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,21.596771 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_40"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,27.795670 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi10_39"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,38.223373 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_49"></use>
    <use xlink:href="#GLYPHcmr10_41" x="5.000095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,55.934647 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmsy10_1"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,63.904770 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_82"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,77.653137 15.088348)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_121"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,85.315262 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_40"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,91.514297 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi10_39"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,101.941879 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_50"></use>
    <use xlink:href="#GLYPHcmr10_41" x="5.000095"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,119.653305 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmsy10_1"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,127.623398 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmbx10_82"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,141.371796 15.088348)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi7_122"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,148.716614 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_40"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,154.915665 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmmi10_39"></use>
  </g>
  <g transform="matrix(1.600006,-0.000000,-0.000000,1.600006,165.343216 12.697296)" style="fill: rgb(0.000000%,0.000000%,0.000000%);">
    <use xlink:href="#GLYPHcmr10_51"></use>
    <use xlink:href="#GLYPHcmr10_41" x="5.000095"></use>
  </g>
</svg></span>), you can create the
corresponding homogeneous transformation matrix step by step using the
operators <a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate</span><span data-if="c" style="display:none">hom_mat3d_rotate</span><span data-if="cpp" style="display:none">HomMat3dRotate</span><span data-if="com" style="display:none">HomMat3dRotate</span><span data-if="dotnet" style="display:none">HomMat3dRotate</span><span data-if="python" style="display:none">hom_mat3d_rotate</span></code></a> and <a href="hom_mat3d_translate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_translate</span><span data-if="c" style="display:none">hom_mat3d_translate</span><span data-if="cpp" style="display:none">HomMat3dTranslate</span><span data-if="com" style="display:none">HomMat3dTranslate</span><span data-if="dotnet" style="display:none">HomMat3dTranslate</span><span data-if="python" style="display:none">hom_mat3d_translate</span></code></a> and then
convert the resulting matrix into a pose using <a href="hom_mat3d_to_pose.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_to_pose</span><span data-if="c" style="display:none">hom_mat3d_to_pose</span><span data-if="cpp" style="display:none">HomMat3dToPose</span><span data-if="com" style="display:none">HomMat3dToPose</span><span data-if="dotnet" style="display:none">HomMat3dToPose</span><span data-if="python" style="display:none">hom_mat3d_to_pose</span></code></a>.
The following example code creates a pose from the ZYZ representation
described above:
</p>
<div style="text-align:center"><table style="width:90%;margin-left:auto;margin-right:auto" class="layout">
<col span="1" style="width:90%;">
<tr><td style="text-align:left">
<a href="hom_mat3d_identity.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_identity(HomMat3DIdent)</span><span data-if="c" style="display:none">hom_mat3d_identity(HomMat3DIdent)</span><span data-if="cpp" style="display:none">HomMat3dIdentity(HomMat3DIdent)</span><span data-if="com" style="display:none">HomMat3dIdentity(HomMat3DIdent)</span><span data-if="dotnet" style="display:none">HomMat3dIdentity(HomMat3DIdent)</span><span data-if="python" style="display:none">hom_mat3d_identity(HomMat3DIdent)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate(HomMat3DIdent, phi3, 'z', 0, 0, 0, HomMat3DRotZ)</span><span data-if="c" style="display:none">hom_mat3d_rotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="cpp" style="display:none">HomMat3dRotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="com" style="display:none">HomMat3dRotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="dotnet" style="display:none">HomMat3dRotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span><span data-if="python" style="display:none">hom_mat3d_rotate(HomMat3DIdent, phi3, "z", 0, 0, 0, HomMat3DRotZ)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate(HomMat3DRotZ, phi2, 'y', 0, 0, 0, HomMat3DRotZY)</span><span data-if="c" style="display:none">hom_mat3d_rotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="cpp" style="display:none">HomMat3dRotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="com" style="display:none">HomMat3dRotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="dotnet" style="display:none">HomMat3dRotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span><span data-if="python" style="display:none">hom_mat3d_rotate(HomMat3DRotZ, phi2, "y", 0, 0, 0, HomMat3DRotZY)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_rotate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_rotate(HomMat3DRotZY, phi1, 'z', 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="c" style="display:none">hom_mat3d_rotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="cpp" style="display:none">HomMat3dRotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="com" style="display:none">HomMat3dRotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="dotnet" style="display:none">HomMat3dRotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span><span data-if="python" style="display:none">hom_mat3d_rotate(HomMat3DRotZY, phi1, "z", 0, 0, 0, HomMat3DRotZYZ)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_translate.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_translate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="c" style="display:none">hom_mat3d_translate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="cpp" style="display:none">HomMat3dTranslate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="com" style="display:none">HomMat3dTranslate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="dotnet" style="display:none">HomMat3dTranslate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span><span data-if="python" style="display:none">hom_mat3d_translate(HomMat3DRotZYZ, Tx, Ty, Tz, base_H_tool)</span></code></a>
</td></tr>
<tr><td style="text-align:left">
<a href="hom_mat3d_to_pose.html"><code><span data-if="hdevelop" style="display:inline">hom_mat3d_to_pose(base_H_tool, RobPose)</span><span data-if="c" style="display:none">hom_mat3d_to_pose(base_H_tool, RobPose)</span><span data-if="cpp" style="display:none">HomMat3dToPose(base_H_tool, RobPose)</span><span data-if="com" style="display:none">HomMat3dToPose(base_H_tool, RobPose)</span><span data-if="dotnet" style="display:none">HomMat3dToPose(base_H_tool, RobPose)</span><span data-if="python" style="display:none">hom_mat3d_to_pose(base_H_tool, RobPose)</span></code></a>
</td></tr>
</table></div>
<p>Please note that the hand-eye calibration only works if the poses of the
tool in robot base coordinates are specified with high accuracy. Of the
provided methods, <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> set to <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>
will yield the most robust results with respect to noise on the poses of the
tool in robot base coordinates. The estimation will be better the more
input poses are used.
</p>
<p>Please note that this operator supports canceling timeouts and interrupts
if <i><span data-if="hdevelop" style="display:inline">'optimization_method'</span><span data-if="c" style="display:none">"optimization_method"</span><span data-if="cpp" style="display:none">"optimization_method"</span><span data-if="com" style="display:none">"optimization_method"</span><span data-if="dotnet" style="display:none">"optimization_method"</span><span data-if="python" style="display:none">"optimization_method"</span></i> is set to <i><span data-if="hdevelop" style="display:inline">'stochastic'</span><span data-if="c" style="display:none">"stochastic"</span><span data-if="cpp" style="display:none">"stochastic"</span><span data-if="com" style="display:none">"stochastic"</span><span data-if="dotnet" style="display:none">"stochastic"</span><span data-if="python" style="display:none">"stochastic"</span></i>.
</p>
<h2 id="sec_execution">运行信息</h2>
<ul>
  <li>多线程类型:可重入(与非独占操作符并行运行)。</li>
<li>多线程作用域:全局(可以从任何线程调用)。</li>
  
    <li>Automatically parallelized on internal data level.</li>
  
</ul>
<p>This operator supports canceling timeouts and interrupts.</p>
<p>This operator modifies the state of the following input parameter:</p>
<ul><li><a href="#CalibDataID"><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></a></li></ul>
<p>During execution of this operator, access to the value of this parameter must be synchronized if it is used across multiple threads.</p>
<h2 id="sec_parameters">参数表</h2>
  <div class="par">
<div class="parhead">
<span id="CalibDataID" class="parname"><b><code><span data-if="hdevelop" style="display:inline">CalibDataID</span><span data-if="c" style="display:none">CalibDataID</span><span data-if="cpp" style="display:none">CalibDataID</span><span data-if="com" style="display:none">CalibDataID</span><span data-if="dotnet" style="display:none">calibDataID</span><span data-if="python" style="display:none">calib_data_id</span></code></b> (input_control, state is modified)  </span><span>calib_data <code>→</code> <span data-if="dotnet" style="display:none"><a href="HCalibData.html">HCalibData</a>, </span><span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">HHandle</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (handle)</span><span data-if="dotnet" style="display:none"> (<i>IntPtr</i>)</span><span data-if="cpp" style="display:none"> (<i>HHandle</i>)</span><span data-if="c" style="display:none"> (<i>handle</i>)</span></span>
</div>
<p class="pardesc">Handle of a calibration data model.</p>
</div>
  <div class="par">
<div class="parhead">
<span id="Errors" class="parname"><b><code><span data-if="hdevelop" style="display:inline">Errors</span><span data-if="c" style="display:none">Errors</span><span data-if="cpp" style="display:none">Errors</span><span data-if="com" style="display:none">Errors</span><span data-if="dotnet" style="display:none">errors</span><span data-if="python" style="display:none">errors</span></code></b> (output_control)  </span><span>number-array <code>→</code> <span data-if="dotnet" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="python" style="display:none">Sequence[float]</span><span data-if="cpp" style="display:none"><a href="HTuple.html">HTuple</a></span><span data-if="c" style="display:none">Htuple</span><span data-if="hdevelop" style="display:inline"> (real)</span><span data-if="dotnet" style="display:none"> (<i>double</i>)</span><span data-if="cpp" style="display:none"> (<i>double</i>)</span><span data-if="c" style="display:none"> (<i>double</i>)</span></span>
</div>
<p class="pardesc">Average residual error of the optimization.</p>
</div>
<h2 id="sec_predecessors">可能的前置算子</h2>
<p>
<code><a href="create_calib_data.html"><span data-if="hdevelop" style="display:inline">create_calib_data</span><span data-if="c" style="display:none">create_calib_data</span><span data-if="cpp" style="display:none">CreateCalibData</span><span data-if="com" style="display:none">CreateCalibData</span><span data-if="dotnet" style="display:none">CreateCalibData</span><span data-if="python" style="display:none">create_calib_data</span></a></code>, 
<code><a href="set_calib_data_cam_param.html"><span data-if="hdevelop" style="display:inline">set_calib_data_cam_param</span><span data-if="c" style="display:none">set_calib_data_cam_param</span><span data-if="cpp" style="display:none">SetCalibDataCamParam</span><span data-if="com" style="display:none">SetCalibDataCamParam</span><span data-if="dotnet" style="display:none">SetCalibDataCamParam</span><span data-if="python" style="display:none">set_calib_data_cam_param</span></a></code>, 
<code><a href="set_calib_data_calib_object.html"><span data-if="hdevelop" style="display:inline">set_calib_data_calib_object</span><span data-if="c" style="display:none">set_calib_data_calib_object</span><span data-if="cpp" style="display:none">SetCalibDataCalibObject</span><span data-if="com" style="display:none">SetCalibDataCalibObject</span><span data-if="dotnet" style="display:none">SetCalibDataCalibObject</span><span data-if="python" style="display:none">set_calib_data_calib_object</span></a></code>, 
<code><a href="set_calib_data_observ_pose.html"><span data-if="hdevelop" style="display:inline">set_calib_data_observ_pose</span><span data-if="c" style="display:none">set_calib_data_observ_pose</span><span data-if="cpp" style="display:none">SetCalibDataObservPose</span><span data-if="com" style="display:none">SetCalibDataObservPose</span><span data-if="dotnet" style="display:none">SetCalibDataObservPose</span><span data-if="python" style="display:none">set_calib_data_observ_pose</span></a></code>, 
<code><a href="find_calib_object.html"><span data-if="hdevelop" style="display:inline">find_calib_object</span><span data-if="c" style="display:none">find_calib_object</span><span data-if="cpp" style="display:none">FindCalibObject</span><span data-if="com" style="display:none">FindCalibObject</span><span data-if="dotnet" style="display:none">FindCalibObject</span><span data-if="python" style="display:none">find_calib_object</span></a></code>, 
<code><a href="set_calib_data.html"><span data-if="hdevelop" style="display:inline">set_calib_data</span><span data-if="c" style="display:none">set_calib_data</span><span data-if="cpp" style="display:none">SetCalibData</span><span data-if="com" style="display:none">SetCalibData</span><span data-if="dotnet" style="display:none">SetCalibData</span><span data-if="python" style="display:none">set_calib_data</span></a></code>, 
<code><a href="remove_calib_data.html"><span data-if="hdevelop" style="display:inline">remove_calib_data</span><span data-if="c" style="display:none">remove_calib_data</span><span data-if="cpp" style="display:none">RemoveCalibData</span><span data-if="com" style="display:none">RemoveCalibData</span><span data-if="dotnet" style="display:none">RemoveCalibData</span><span data-if="python" style="display:none">remove_calib_data</span></a></code>, 
<code><a href="remove_calib_data_observ.html"><span data-if="hdevelop" style="display:inline">remove_calib_data_observ</span><span data-if="c" style="display:none">remove_calib_data_observ</span><span data-if="cpp" style="display:none">RemoveCalibDataObserv</span><span data-if="com" style="display:none">RemoveCalibDataObserv</span><span data-if="dotnet" style="display:none">RemoveCalibDataObserv</span><span data-if="python" style="display:none">remove_calib_data_observ</span></a></code>
</p>
<h2 id="sec_successors">可能的后置算子</h2>
<p>
<code><a href="get_calib_data.html"><span data-if="hdevelop" style="display:inline">get_calib_data</span><span data-if="c" style="display:none">get_calib_data</span><span data-if="cpp" style="display:none">GetCalibData</span><span data-if="com" style="display:none">GetCalibData</span><span data-if="dotnet" style="display:none">GetCalibData</span><span data-if="python" style="display:none">get_calib_data</span></a></code>
</p>
<h2 id="sec_references">References</h2>
<p>

K. Daniilidis: “Hand-Eye Calibration Using Dual Quaternions”;
International Journal of Robotics Research, Vol. 18, No. 3,
pp. 286-298; 1999.
<br>
M. Ulrich, C. Steger: “Hand-Eye Calibration of SCARA Robots Using Dual
Quaternions”; Pattern Recognition and Image Analysis, Vol. 26, No. 1,
pp. 231-239; January 2016.
<br>
M. Ulrich, M. Hillemann: “Generic Hand–Eye Calibration of Uncertain
Robots”; 2021 IEEE International Conference on Robotics and
Automation (ICRA), pp. 11060-11066; 2021.

</p>
<h2 id="sec_module">模块</h2>
<p>
Calibration</p>
<!--OP_REF_FOOTER_START-->
<hr>
<div class="indexlink">
<a href="index_classes.html"><span data-if="dotnet" style="display:none;">类别</span><span data-if="cpp" style="display:none;">类别</span></a><span data-if="dotnet" style="display:none;"> | </span><span data-if="cpp" style="display:none;"> | </span><a href="index_by_name.html">算子列表</a>
</div>
<div class="footer">
<div class="copyright">HALCON算子参考手册 Copyright © 2015-2023 51Halcon</div>
</div>
</div>
</body>
</html>
